[백엔드] 스프링 부트와 JPA 활용 3 - 회원 도메인 개발

유승선 ·2022년 7월 21일
1

애플리케이션 구현 준비

애플리케이션 아키텍처

애플리케이션 아키텍처는 위와 같다. JPA 를 직접 사용하는 계층인 repository가 따로 있고, 비즈니스 로직, 트랜잭션을 처리하는 service 층 그리고 controller 로 나뉘어져 있는게 신기했다.

이런 식으로 Package 를 나뉘어서 다 따로 만들고 해당 패키지에 맞는 클래스들을 넣어주었다. 어떻게 보면 가장 기본적인 구조지만 혼자 개발을 하게되도 이렇게 다 잘 나눠서 할 수 있을지 고민이 들었다.

회원 도메인 개발 부분에서는 위와 같은 순서로 진행을 했고. 핵심 기능인 등록 하는 부분과 조회 하는 부분은 이후에도 더 설명을 하겠지만, Repository 를 사용해서 JPA 에 접근을 하고 Service 계층을 사용해서 직접 구현을 하게 만들었다.

회원 리포지토리 개발

회원 리포지토리 개발

여러가지 주석을 달아놨는데 요약을 한 설명은 아래와 같다.

추가적인 설명을 붙히자면은 이 부분은 repository 패키지 안에 있는 MemberRepository 클래스로서 컴포넌트 스캔을 통한 빈 등록을 위해서 @Repository 를 붙혀줬다.

컴포넌트 스캔에 대한 자세한 설명은 스프링 기본편을 다시 참고해도 좋을거같았다. 그리고 아직 익숙하지 않은 어노테이션 몇개로는 @PersistenceContext 가 있고 EntityManager 클래스로 만든 em 을 빈에 주입 시켜주는 역활을 하고있다고 했을때 신기했다.

  • save() 같은 경우는 EntityManager 클래스에서 persist() 를 부르는 것과 같은건느 이제 잘 알겠다. 다만 persist() 가 좀 더 중요한 이유는 일반적인 DB에 등록을 시키는게 아닌 객체를 등록시키는 형태로 JPA 에서 활용되는 중요한 method 인거를 인지하고 있어야 겠다. 물론 더 많은 공부가 필요하다.

  • findOne() 은 EntityManager 에 있는 find(type,pk) 메서드를 사용했고 타입을 넣을때는 Member.class 이런식으로 넣어주었다.

  • findAll() 은 리스트를 리턴해야 했고 List<클래스> 로 해서 EntityManager에서 JPQL 을 바로 쓸수있는 createQuery 문을 사용했다. 이 부분도 더 공부해야 되는 거같다.

  • findByName() 또한 비슷한 원리로 실행 시켰지만, 조금 더 복잡한 JPQL 쿼리를 사용했고 나머지 로직은 똑같다.

회원 서비스 개발

회원 서비스 개발

가장 많은 설명을 적은거 같은데 대부분에 주석은 필드 주입과 세터 주입에 대한 차이점을 적었기에 많은 공간을 차지 했던거같다. 기술 설명에 대한 간단한 내용은 아래와 같다.

똑같이 @Service 어노테이션을 써서 컴포넌트 스캔을 똑같이 구현해주었다. @Transactional 같은 경우 꼭 필요한 어노테이션으로 알고있는데 파라미터에 readOnly 를 true/false 로 설정함으로서 기능 향상에 큰 도움이 된다고 하였다.

@Autowired 는 주입하는데 필요한 어노테이션으로 많이 써봤다.

  • join() 같은 경우 MemberRepository 에 존재하는 save() 메서드를 불렀고 save() 는 persist() 를 콜함으로서 객체가 등록된거를 확인할 수 있었다. 확인 방법으로는 아이디가 리턴 되기에 체크하면 됐고, validateDuplicate 로 중복되는 회원에 아이디도 걸러주었다.

  • findMembers() 특별한거 없다, 멤버리포지토리 메서드를 콜 해주었다.

  • findOne() 또한 앞서 설명한 리포지토리 메서드에 적혀있다.

필드 주입과 세터주입도 설명을 해줬지만 전부 추천하는 방법은 아니라고 했다, 이유로는 언제든 리포지토리는 바뀔수도 있고 좀 더 유연하게 사용을 하기 위해 언제나 생성자 주입을 추천한다고 강조했다

추가적으로 리포지토리를 priave final 로 만든후에 롬북에 있는 어노테이션을 사용하면은 생성자 주입이 자동으로 만들어진다고 해서 신기했다.

회원 기능 테스트

회원 기능 테스트

회원 기능 테스트로는 크게 설명할 부분이 없지만 앞서 구현했던 회원가입 메서드와 중복 회원을 예외 시켜주는 메서드를 테스트 하기 위해 만들어 주었다.

기술 설명에는 내가 계속 궁금해 했던 스프링부트 테스트가 뭔지 설명을 해줬어서 좋았다. @Transactional을 붙히면은 실제 DB에 영향없이 테스트 하게 할수있지만 (롤백) 만약에 DB에 테스트 되는것을 확인해보고 싶다면 @Rollback(false) 를 써도 된다.

사실 이번 강의에서 제일 신기했던 부분은 여기였다. 실수로 H2 데이터 베이스를 실행 안시켜서 계속 테스트 케이스가 에러나서 너무 속상했는데 이제는 까먹고 그럴 이유없이 application.yml 파일을 테스트케이스 리소스에 설정을 하고

이렇게 datasource url 을 mem:testdb 에 쓰는것으로 훨씬 편해졌다. 왜 H2 데이터베이스가 교육을 하고 개인 프로젝트를 하는데 많이 쓰이는지 새삼 체감이 됐었다.

잊지말고 테스트 폴더 밑에다가 리소스 파일을 만들어주고 yml 파일을 만들어주자!


배운점

배운점

앞으로 강의 3개 정도만 보면은 기본적인 구현까지 문제 없이 잘 할수 있을거같다. 영상 하나 하나 보면서 정말 천천히 이해하고 몇번씩 다시 보고 하니깐 이전에 봤던 내용들이 조금씩 도움이 되는 기분이다. 이 강의를 다 보고 나서는 JPA 기본편을 갈것이지만 가기전에 이미 벨로그에 정리했던 Spring 기본편을 다시 봐도 좋을거같다.

profile
성장하는 사람

0개의 댓글