스프링 DB 접근 기술

naeganugu·2022년 7월 8일
0

스프링 마스터🌱

목록 보기
4/19
post-thumbnail

1. @Transactional

DB는 commit 하기 전에는 반영이 안된다. 따라서 테스트 끝나고 rollback 해버리면 디비에는 반영이 안된다. test 끝나고 rollback 해주는 어노테이션이 @Transactional 이다.

@AfterEach 로 지워주지 않아도 테스트 반복해서 실행이 가능하다(애초에 DB에 반영이 된 적이 없기 때문!) 테스트 케이스에 붙었을 때만 항상 rollback 하도록 작동한다.

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;


    @Test
    @Commit
    void 회원가입() {

이렇게 @Commit 달아주면 test지만 rollback 되지 않고 commit 되어 DB에 반영된다.

@Transactional: 테스트 케이스에 붙어있으면, 테스트 시작 전에 트랜잭션을 시작하고 테스트 후에 rollback한다. 따라서 DB에는 변경사항이 반영되지 않으므로 @AfterEach로 지워주지 않아도 다음 테스트 영향 없다.

2. @SpringBootTest

스프링을 띄워서 테스트를 하는 것.
원래 테스트는 스프링 통합 테스트보다 가급적 순수한 단위 테스트가 좋은 테스트다. 스프링 컨테이너 없이 테스트 하는 게 좋은 테스트일 확률이 높다. 통합 테스트도 필요는 하다만 단위 테스트로 만드는 게 더 중요하다.

@SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.

3. 스프링 JdbcTemplate

JDBC API에서 반복적인 코드를 제거해준다.


꼭 강아지만이 아니다. 반복되는 코드는 개발자를 불안하게 한다.
그래서 순수 JDBC에서 점점 발전되어 JdbcTemplate가 나오게 된다.
하지만 SQL문은 직접 작성해야 한다.

private final JdbcTemplate jdbcTemplate;

@Autowired // 생성자가 이거 하나면 @Autowired 생략 가능
public JdbcTemplateMemberRepository(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

DataSource를 주입받아서 쓴다. DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다.

4. JPA

반복 코드도 제거해주고 SQL도 직접 만들어서 실행해주는 아주 효자다.

application.properties 파일

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

ddl-auto: 테이블을 자동으로 생성하는 기능을 제공한다. 해당 예제에서는 직접 사용자 테이블을 만들어줬기 때문에 이 기능을 꺼주기 위해 none을 사용했다. create로 설정하면 entity 정보를 바탕으로 테이블도 직접 생성해준다.

이게 뭐라고 캡스톤 때 create로 했다가 create-drop 했다가 update 했다가 하다가 DB 날렸었던 기억이 있다.. 왜 그랬는지도 몰랐는데 조금 알 거 같다..

우선 JPA를 쓰려면 entity mapping 해야한다. Hibernate는 JPA의 구현체이다. 즉, JPA는 인터페이스고 구현체가 Hibernate 인 것이다. 캡스톤 하면서 Hibernate를 얼핏 들었던 기억이 있는데 뭔지 몰랐는데 이제 알았다.

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

@Id: PK 매핑
@GeneratedValue: IDENTITY는 DB가 id를 자동으로 생성해준다.

@Column(name = "username")
private String name;

@Column: DB에 있는 username과 매칭된다.

public class JpaMemberRepository implements MemberRepository{

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }

EntityManager는 스프링부트가 자동으로 생성해주고 주입 받아서 사용하게 된다.

@Transactional
public class MemberService {

JPA 쓰려면 항상 @Transactional 있어야 한다. 데이터를 저장하거나 변결할 때 꼭 @Transactional 이 있어야 한다. 그래서 서비스 계층에 트랜잭션을 추가한 것!!

5. 스프링 데이터 JPA

사실 캡스톤 하면서 썼던 게 스프링 데이터 JPA였다. 강의에서 순수 JDBC -> 스프링 JdbcTemplate -> JPA -> 스프링 데이터 JPA 순으로 진행이 되는데, 보면서 계속 '저거보다 더 단순하게 썼던 거 같은데 왜 이렇게 어렵게 쓰지?' 싶었다.

그런데 강사님이 "JPA에 대해 먼저 이해를 하고 스프링 데이터 JPA를 써야한다. 스프링 데이터 JPA는 JPA를 편하게 사용하도록 도와주는 기술일 뿐." 이런 식으로 말씀하셨다.

열심히 공부하자...

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {

    @Override
    Optional<Member> findByName(String name);

}

내가 보기에도 굉장히 쉬웠던 것처럼 쉽다.. 이게 된다고? 싶었던
정확하게 작동하는 방식은 Spring data JPA가 구현체를 자동으로 만들어서 스프링 빈으로 등록해준다.



[출처]

스프링-입문-스프링부트

profile
seungseung-zanggu

0개의 댓글