[Spring Boot] TIL - 7 도메인 개발 (실전! 스프링 부트와 JPA 활용1 - 섹션 4 회원 도메인 개발)

하이초·2022년 9월 16일

Spring_Boot

목록 보기
7/11
post-thumbnail

1. 회원 리포지터리 개발

🥨 Spring boot repositoy 관련 어노테이션

  • @Repository
  • @PersistenceContext: EntityManager 생성 주입
  • @PersistenceUnit: EntityManager Factory를 직접 생성 할 수 있음

🥨 전체 리스트를 가져와야 할때

  • query를 날려야 함
    - List result = em.creatQuery("select m from Member m", Member.class).getResultList();
    - sql은 테이블을 찍는데, jsql entity를 대상으로 함

🥨 Entity Manager method

  • find(type, pk): 단건 조회
  • createQuery: query 조회

2. 회원 서비스 개발

🥨 @Service

🥨 @Transactional

  • 모든 데이터를 변경하는 처리는 한 transactional 안에서 이루어져야 한다
  • (readOnly = true): 정보를 조회하는 곳에서 좀 더 최적화 된 성능을 만들어주기도 함(db에 따라 다름)

🍯 허니팁

  • validateDuplicateMember와 같은 메소드의 경우 여러 곳에서 동시에 호출하면 검증에 실패할 수 있으므로 db에서 name을 유니크로 설정하거나 하는 등으로 더 제약을 걸어줘야 한다
    • 이거 관련해서 옛날에 싱글톤패턴 할 때 뭔가 동시에 접근할 수 없게.. 약간 뮤텍스처럼 처리해주는 게 있었던 것 같은데 찾아봐야겠다
  • Autowired: 이걸 통해서 주입받으면 수정을 못하니까 세터 인젝션을 통해서 수정할 수 있다
    • but 이것도 runtime에 누군가 바꿀 수 있기 때문에.. and 동작할 때 바꿀일이 없음
    • so, 요즘 많이 쓰는 것은 생성자 인젝션!, 생성자가 하나만 있으면 autowired 어노테이션이 없어도 스프링이 알아서 넣어준다, final을 넣어줘야 좋음 -> 이걸 자동으로 해주는 것이 @RequiredArgsConstructor, final이 붙은 것만 필수 매개변수로 해서 생성자를 만들어 준다
    • 이렇게 하면 테스트케이스에서 활용 좋음
    • 원래 EM은 Autowired 못쓰고, Persistence 로 해줘야 하는데 RequiredArgsConstructor는 가넝~!
  • RequiredArgsConstructro = final이 붙은 멤버변수들을 필수 매개변수로 한 생성자를 만들어준다

❓ 이건 뭐람?

  • component: component 속성을 가지고 있으면 component scan의 대상이 돼서 spring bin에 자동으로 등록이 된다고 하는데 component란?
  • persist: 영속성.. 객체..? 뭐지.. 이거..?
  • transactional: ...?

3. 회원 기능 테스트

🥨 Transactional

  • jpa에서 같은 트랜잭션 안에서 같은 pk를 가지고 있으면 같은 영속성으로 관리가 됨..?

🥨 fail

  • 테스트에서 예외가 발생하지 않고 아래로 흘렀을 때 체크할 수 있게 하는 것, 만약에 두지 않으면 예외가 발생해야 할 상황인데 걍 성공처리 돼서 모를 수 있음

🥨 @Test(expected = IllegalStateException.class)

  • 예외가 터져야 하는 케이스에 굳이 try, catch문을 작성하지 않아도 됨

🥨 jdbc:h2:mem:test

  • 메모리모드로 테스트를 진행할 수 있게 해줌! 테스튼데 아무리 롤백이 되어도 실 db에 하면 안조으니께~
  • 근데 아무 설정을 안하면 걍 메모리 모드로 돌려줌;;;; 스프링부트 개짱이다 진짜...
  • 그래도 운영과 테스트 설정은 다르게 하는 게 상식이다!!!
  • 스프링부트는 create가 아니라 create-drop으로 운영됨. 드랍은 마지막에 쿼리를 다 날려서 초기화 해줌(사실 memory 모드는 was가 내려가면 다 꺼지긴 하는데,, 걍 더 깔끔하게~)

오늘의 미결사항

  1. 영속성
  2. transactional
profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글