2022_02_13 - oneso123456789/2022 GitHub Wiki

other

깨끗한 코드를 위한 5가지 팁
https://www.youtube.com/watch?v=Jz8Sx1XYb04

1) 검색이 가능한 이름을 써라((Use a searchable name.)

변수가 무엇을 의미하는지 한번에 알수있는 이름

2) 함수명은 반드시 동사를 사용해라(Function name should be verbs.)

EX:유저데이터 X 유저데이터 불러오기 O
함수는 무조건 한가지 액션만을 수행해야함

3) 함수의 인수는 3개 이하가 적당함

만약 어쩔수없이 많은 인수를 사용해야 한다면 configuration object로 정리해서 parm사용하기

4) boolean 값을 인수로 보내는걸 최대한 방지

추천하는것은 각각의 if-else 값을 다른 함수로 분리하는것임

5) 짧은 변수명이나 (아무도 이해못하는)축약어 쓰는 것을 피하자

ex:e X email O

주의

번외 문제를 해결해야하는 코딩 초반부에는 우선 동작과 작동에 초점을 맞춰서 작업
문제를 해결한 후 깔끔하게 코딩정리하는것이 좋음

영속영역의 CRUD 구현

웹 프로젝트 구조에서 마지막 영역이 영속영역이지만,
실제로 구현을 가장 먼저 할 수 있는 영역도 영속 영역임.
영속 영역은 기본적으로 CRUD 작업을 하기 때문에 테이블과 VO(DTO) 등 약간의
준비만으로도 비즈니스 로직과 무관하게 CRUD 작업을 작성할 수 있음

MyBatis는 내부적으로 JDBC의 PreparedStatement를 활용하고 필요한
파라미터를 처리하는 '?'에 대한 치환은 #{속성}을 이용해서 처리함

create(insert)처리

tbl_board 테이블은 PK 칼럼으로 bno를 이용하고,
시퀀스를 이용해서 자동으로 데이터가 추가될 때 번호가 만들어지는 방식 사용

이처럼 자동으로 PK값이 정해지는 경우에는 다음과 같은 2가지 방식으로 처리가능

  • insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우
  • insert문이 실행되고 생성된 pk 값을 알아야 하는 경우

BoardMapper 인터페이스에는 위의 상황을 고려해서 다음과 같이 메서드를 추가함

BoardMapper.interface 코드추가

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);

}

BoardMapper.xml 코드 추가

<?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 클래스에
새로운 메서드로 작성해보면 다음과 같이 작성할 수 있음

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를 이용하는 경우 테스트 코드는 다음과 같음

BoardMapperTests 클래스의 일부

    @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값을 확인해야 하는 상황에서는 유용하게 사용될 수 있음

⚠️ **GitHub.com Fallback** ⚠️