ctrl + E
: 최근에 봤던 파일 목록sql/ddl.sql
파일을 생성해서 따로 관리해주면 좋다.ㅉㅉimplementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
Alt + Endter
: implement methods를 빠르고 간편하게 할 수 있다.
@Config
부분에 assembly만 바꿔주면 되는데 바로 이렇게 바꾸어줄 수 있다.
@SpringBootTest
: 스프링 컨테이너와 테스트를 함께 실행한다. 요즘은 이거 하나로 된다. "Spring Boot 만세"
@Transactional
: 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다. 그런데 또 강제로 transaction을 저장하기위한 메서드에 붙이는 @Commit
어노테이션 도 있다.
@AfterEach
public void afterEach(){ repository.cleaStore(); }
spring 컨테이너 없이 unit test하는 것이 좋고 이것에 익숙해져야한다. 물론 그게 항상 좋은 test다 라고 말할 순 없고 반드시 통합 테스트가 필요한 순간도 오겠지만 보통은 단위 test가 좋은 test일 확률이 높다. 즉 unit test를 잘 만들어야 한다.
jdbctemplate
과 mybatis
같은 libary는 jdbc api에서 본 반복 코드를 대부분 제거해준다. 하지만 sql은 직접 작성해야한다.private final JdbcTemplate jdbcTemplate;
@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
alt + Enter
(mac:opt+enter
) lambda식으로 더 간소화 하여 만들 수 있다.private RowMapper<Member> memberRowMapper(){
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
return result.stream().findAny();
}
위에서 만든 RowMapper 객체를 바로 가져와서 쓴 모습이다.
즉, 원래는 JDBC를 연결하고 conn을 얻어서 다시 psmt에 집어넣고 쿼리돌리고 리소스 때문에 다시 연결을 끊고 이러한 긴 작업과정을 Spring JDBC Template를 사용하면 위 코드들 처럼 연결하는 코드 1개 그리고 쿼리문 날리는 메서드 1개 면 끝난다는 장점이 있다.