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가 내려가면 다 꺼지긴 하는데,, 걍 더 깔끔하게~)
오늘의 미결사항
- 영속성
- transactional