Enum class 활용
- Enum 클래스 활용
NOTICE, FAQ, INQUIRY 같은 코드 형태의 값의 이름을 DB에서 가져오기 위해 JOIN을 사용하는 대신 enum으로 처리 - DB 컬럼 값이 코드일 경우 Enum 클래스를 사용하는 이유
1) 불필요한 테이블 및 코드 관리가 없어짐
2) 리스트, 상세 조회 시 코드에 대한 코드명을 TABLE JOIN 등을 통해 가져오는 불필요한 쿼리가 사라짐 - Board 테이블에 BOARD_TYPE VARCHAR(10) 컬럼 추가 및 Board.xml 쿼리 수정
ALTER TABLE `T_BOARD`
CHANGE COLUMN `BOARD_SEQ`, `BOARD_SEQ` INT(11) NOT NULL AUTO_INCREMENT COMMENT '게시물 번호' FIRST,
ADD COLUMN `BOARD_TYPE` VARCHAR(10) NOT NULL COMMENT '게시판 종류' AFTER `BOARD_SEQ`
...
<select id="getList" parameterType="com.example.examplespring.mvc.domain.Board" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
ORDER BY B.REG_DATE DESC
</select>
<select id="get" parameterType="int" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
WHERE B.BOARD_SEQ = #{boardSeq}
</select>
<insert id="save" parameterType="com.example.examplespring.mvc.parameter.BoardParameter" useGeneratedKeys="true" keyProperty="boardSeq">
INSERT INTO T_BOARD
(
B.BOARD_TYPE,
TITLE,
CONTENTS,
REG_DATE
)
VALUES
(
#{boardType.code},
#{title},
#{contents},
NOW()
)
</insert>
...
<update id="update" parameterType="com.example.examplespring.mvc.domain.Board">
UPDATE T_BOARD
SET
BOARD_TYPE = #{boardType.code},
TITLE = #{title},
CONTENTS = #{contents}
WHERE BOARD_SEQ = #{boardSeq}
</update>
...
</mapper>
- BaseCodeLabelEnum 인터페이스와 BoardType enum 클래스 생성
// 기본 CodeLabelEnum
public interface BaseCodeLabelEnum {
/**
* 코드를 리턴
* @return
*/
String code();
/**
* 라벨(코드명)을 리턴
* @return
*/
String label();
}
// 게시판 종류
// BaseCodeLabelEnum 인터페이스 구현
public enum BoardType implements BaseCodeLabelEnum {
NOTICE("공지사항"),
FAQ("자주묻는질문"),
INQUIRY("1:1문의")
;
// 내부 변수 선언
private String code;
private String label;
BoardType(String label) {
this.code = name(); // 리턴되는 값은 선언한 NOTICE, FAQ, INQUIRY
this.label = label; // 생성자로 온 공지사항, 자주묻는질문, 1:1문의
}
@Override
public String code() {
// 내부 변경 지정
return code;
}
@Override
public String label() {
return label;
}
}
- Board 클래스에 BoardType boardType 변수 추가
@Data
public class Board {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private Date regDate;
}
- BaseCodeLabelEnumJsonSerializer 클래스 추가
// JSON 변환시 BaseCodeLabelEnum 클래스에 대한 변환을 동일하게 처리
public class BaseCodeLabelEnumJsonSerializer extends JsonSerializer<BaseCodeLabelEnum> {
@Override
public void serialize(BaseCodeLabelEnum value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("code", value.code());
map.put("label", value.label());
jsonGenerator.writeObject(map);
}
}
- WebConfiguration 클래스에 objectMapper, MappingJackson2JsonView Bean 등록
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
...
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(BaseCodeLabelEnum.class, new BaseCodeLabelEnumJsonSerializer());
return objectMapper;
}
@Bean
public MappingJackson2JsonView mappingJackson2JsonView() {
MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
jsonView.setContentType(MediaType.APPLICATION_JSON_VALUE);
jsonView.setObjectMapper(objectMapper());
return jsonView;
}
...
}
- 결과
Swagger에서 save 호출 후 list 조회 결과를 확인하면 boardType이 Object 형태로 코드와 이름이 출력됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] Mybatis를 이용한 검색, 배열 검색과 페이징 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |
[자바 스프링부트 활용 웹개발 실무용] Interceptor와 Logback (0) | 2022.07.20 |
[자바 스프링부트 활용 웹개발 실무용] 공통 Response class, ControllerAdvice와 다국어 프로퍼티를 사용을 통한 예외처리 (0) | 2022.07.19 |
Enum class 활용
- Enum 클래스 활용
NOTICE, FAQ, INQUIRY 같은 코드 형태의 값의 이름을 DB에서 가져오기 위해 JOIN을 사용하는 대신 enum으로 처리 - DB 컬럼 값이 코드일 경우 Enum 클래스를 사용하는 이유
1) 불필요한 테이블 및 코드 관리가 없어짐
2) 리스트, 상세 조회 시 코드에 대한 코드명을 TABLE JOIN 등을 통해 가져오는 불필요한 쿼리가 사라짐 - Board 테이블에 BOARD_TYPE VARCHAR(10) 컬럼 추가 및 Board.xml 쿼리 수정
ALTER TABLE `T_BOARD`
CHANGE COLUMN `BOARD_SEQ`, `BOARD_SEQ` INT(11) NOT NULL AUTO_INCREMENT COMMENT '게시물 번호' FIRST,
ADD COLUMN `BOARD_TYPE` VARCHAR(10) NOT NULL COMMENT '게시판 종류' AFTER `BOARD_SEQ`
...
<select id="getList" parameterType="com.example.examplespring.mvc.domain.Board" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
ORDER BY B.REG_DATE DESC
</select>
<select id="get" parameterType="int" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
WHERE B.BOARD_SEQ = #{boardSeq}
</select>
<insert id="save" parameterType="com.example.examplespring.mvc.parameter.BoardParameter" useGeneratedKeys="true" keyProperty="boardSeq">
INSERT INTO T_BOARD
(
B.BOARD_TYPE,
TITLE,
CONTENTS,
REG_DATE
)
VALUES
(
#{boardType.code},
#{title},
#{contents},
NOW()
)
</insert>
...
<update id="update" parameterType="com.example.examplespring.mvc.domain.Board">
UPDATE T_BOARD
SET
BOARD_TYPE = #{boardType.code},
TITLE = #{title},
CONTENTS = #{contents}
WHERE BOARD_SEQ = #{boardSeq}
</update>
...
</mapper>
- BaseCodeLabelEnum 인터페이스와 BoardType enum 클래스 생성
// 기본 CodeLabelEnum
public interface BaseCodeLabelEnum {
/**
* 코드를 리턴
* @return
*/
String code();
/**
* 라벨(코드명)을 리턴
* @return
*/
String label();
}
// 게시판 종류
// BaseCodeLabelEnum 인터페이스 구현
public enum BoardType implements BaseCodeLabelEnum {
NOTICE("공지사항"),
FAQ("자주묻는질문"),
INQUIRY("1:1문의")
;
// 내부 변수 선언
private String code;
private String label;
BoardType(String label) {
this.code = name(); // 리턴되는 값은 선언한 NOTICE, FAQ, INQUIRY
this.label = label; // 생성자로 온 공지사항, 자주묻는질문, 1:1문의
}
@Override
public String code() {
// 내부 변경 지정
return code;
}
@Override
public String label() {
return label;
}
}
- Board 클래스에 BoardType boardType 변수 추가
@Data
public class Board {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private Date regDate;
}
- BaseCodeLabelEnumJsonSerializer 클래스 추가
// JSON 변환시 BaseCodeLabelEnum 클래스에 대한 변환을 동일하게 처리
public class BaseCodeLabelEnumJsonSerializer extends JsonSerializer<BaseCodeLabelEnum> {
@Override
public void serialize(BaseCodeLabelEnum value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("code", value.code());
map.put("label", value.label());
jsonGenerator.writeObject(map);
}
}
- WebConfiguration 클래스에 objectMapper, MappingJackson2JsonView Bean 등록
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
...
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(BaseCodeLabelEnum.class, new BaseCodeLabelEnumJsonSerializer());
return objectMapper;
}
@Bean
public MappingJackson2JsonView mappingJackson2JsonView() {
MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
jsonView.setContentType(MediaType.APPLICATION_JSON_VALUE);
jsonView.setObjectMapper(objectMapper());
return jsonView;
}
...
}
- 결과
Swagger에서 save 호출 후 list 조회 결과를 확인하면 boardType이 Object 형태로 코드와 이름이 출력됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] Mybatis를 이용한 검색, 배열 검색과 페이징 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |
[자바 스프링부트 활용 웹개발 실무용] Interceptor와 Logback (0) | 2022.07.20 |
[자바 스프링부트 활용 웹개발 실무용] 공통 Response class, ControllerAdvice와 다국어 프로퍼티를 사용을 통한 예외처리 (0) | 2022.07.19 |