2022_02_13 - oneso123456789/2022 GitHub Wiki
깨끗한 코드를 위한 5가지 팁
https://www.youtube.com/watch?v=Jz8Sx1XYb04
변수가 무엇을 의미하는지 한번에 알수있는 이름
EX:유저데이터 X 유저데이터 불러오기 O
함수는 무조건 한가지 액션만을 수행해야함
만약 어쩔수없이 많은 인수를 사용해야 한다면 configuration object로 정리해서 parm사용하기
추천하는것은 각각의 if-else 값을 다른 함수로 분리하는것임
ex:e X email O
번외 문제를 해결해야하는 코딩 초반부에는 우선 동작과 작동에 초점을 맞춰서 작업
문제를 해결한 후 깔끔하게 코딩정리하는것이 좋음
웹 프로젝트 구조에서 마지막 영역이 영속영역이지만,
실제로 구현을 가장 먼저 할 수 있는 영역도 영속 영역임.
영속 영역은 기본적으로 CRUD 작업을 하기 때문에 테이블과 VO(DTO) 등 약간의
준비만으로도 비즈니스 로직과 무관하게 CRUD 작업을 작성할 수 있음
MyBatis는 내부적으로 JDBC의 PreparedStatement를 활용하고 필요한
파라미터를 처리하는 '?'에 대한 치환은 #{속성}
을 이용해서 처리함
tbl_board 테이블은 PK 칼럼으로 bno를 이용하고,
시퀀스를 이용해서 자동으로 데이터가 추가될 때 번호가 만들어지는 방식 사용
이처럼 자동으로 PK값이 정해지는 경우에는 다음과 같은 2가지 방식으로 처리가능
- insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우
- insert문이 실행되고 생성된 pk 값을 알아야 하는 경우
BoardMapper 인터페이스에는 위의 상황을 고려해서 다음과 같이 메서드를 추가함
public interface BoardMapper {
// mapper.xml사용으로 인해 주석처리 @Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
public void insert(BoardVO board);
public void insertSelectKey(BoardVO board);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.crow.mapper.BoardMapper">
<select id="getList" resultType="com.crow.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>
<insert id="insert">
insert into tbl_board(bno,title,content,writer)
values(seq_board.nextval, #{title}, #{content}, #{writer})
</insert>
<insert id="insertSelectKey">
<selectKey keyProperty="bno" order="BEFORE" resultType="long">
select seq_board.nextval from dual
</selectKey>
insert into tbl_board(bno,title,content,writer)
values(#{bno}, #{title}, #{content}, #{writer})
</insert>
</mapper>
BoardMapper의 insert()는 단순히 시퀀스의 다음 값을 구해서 insert할때 사용함
insert문은 몇 건의 데이터가 변경되었지만을 알려주기 때문에 추가된 데이터의 PK 값을 알수는 없지만,
1번의 SQL 처리만으로 작업이 완료되는 장점이 있음
insertSelectKey()는 @SelectKey라는 MyBatis의 어노테이션을 이용함
@SelectKey는 주로 PK 값을 미리(before) SQL을 통해서 처리해 두고 특정한 이름으로 결과를 보관하는 방식임
@Insert 할 때 SQL문을 보면 #{bno}와 같이 이미 처리된 결과를 이용하는 것을 볼 수 있음
우선 insert()에 대한 테스트 코드를 src/test/java 내에 BoardMapperTests 클래스에
새로운 메서드로 작성해보면 다음과 같이 작성할 수 있음
@Test
public void testInsert() {
BoardVO board = new BoardVO();
board.setTitle("testInsert문 제목이라구");
board.setContent("testInsert문 내용이라구");
board.setWriter("testInsert문 작성자라구");
mapper.insert(board);
log.info(board);
}
테스트 코드의 마지막 log.info(board)를 작성한 이유는 Lombok이 만들어주는 toString()을 이용해서
bno 멤버 변수(인스턴스 변수)의 값을 알아보기 위함임
테스트 결과의 마지막을 살펴보면 BoardVO 클래스의 toString()의 결과가 출력되는 것을 볼 수 있음,
bno의 값이 null로 비어 있는 것을 확인할 수 있음
@SelectKey를 이용하는 경우 테스트 코드는 다음과 같음
@Test
public void testInsertSelectKey() {
BoardVO board = new BoardVO();
board.setTitle("새로 작성하는 글 select key");
board.setContent("새로 작성하는 내용 select key");
board.setWriter("새로작성하는 이용자");
mapper.insertSelectKey(board);
log.info(board);
}
실행되는 결과를 살펴보면'select seq_board.nextval from dual`과 같은 쿼리가 먼저 실행되고
여기서 생성된 결과를 이용해서 bno 값으로 처리되는 것을 볼 수 있음
BoardMapper의 insertSelectKey() @Insert 문의 SQL을 보면
'insert into tbl_board(bno,title,content,writer) values(#{bno},$#{title},#{content},#{writer})'와 같이
파라미터로 전달되는 BoardVO의 bno 값을 사용하게 되어 있음
테스트 코드의 마지막 부분을 보면 BoardVO 객체의 bno 값이 이전과 달리 지정된 것을 볼 수 있음
(시퀀스의 값이 현재 테스트 하는 환경마다 다른 값이 나옴, 시퀀스 값은 중복 없는 값을 위한 것일 뿐 다른 의미가 없음)
@SelectKey를 이용하는 방식은 SQL을 한 번 더 실행하는 부담이 있기는 하지만 자동으로 추가되는
PK값을 확인해야 하는 상황에서는 유용하게 사용될 수 있음