공부/Spring

[섹션 2] 스프링 핵심 원리 이해1 - 예제 만들기 (회원 도메인 개발과 테스트 코드 작성)

남쪽마을밤송이 2022. 9. 22. 23:51

* Inflearn에서 "스프링 핵심 원리 - 기본편" by 김영한 강의를 수강하며 작성한 글입니다.

 


 Package 생성 

  • New - Package로 hello.core 밑에 member 패키지를 생성한다.

 

 Class 생성 

  • 이후 New - Class로 필요한 클래스들을 생성한다.
    • Grade는 BASIC, VIP 두 가지 값 중 하나를 선택하는 Enum 타입으로 작성했다.
    • 마찬가지로 Class와 Interface를 구분하여 생성한다.

  • 아래는 member 클래스를 작성하는 과정인데 IntelliJ는 변수 선언 이후 Constructor를 편하게 생성할 수 있다.
    • alt + insert 단축키를 사용하면 간편하다.
    • 전체(Ctrl + A) 선택 후 OK를 클릭한다.

  • 마찬가지로 Getter와 Setter도 생성해준다.

 

  • 참고로 왼쪽의 폴더 구조는 다음과 같이 Flatten 타입과 Compact Middle Packages 중에 고를 수 있다.
    • 강사님은 Compact Middle Packages를 선호한다고 하셨는데 개발자 본인의 성향에 따르면 된다고 하셨다.
    • 하지만 Compact Middle Packages의 경우 단점이 예를 들어 hello.core의 경우 hello밑에 뭘 만들기가 힘들어서 그런 경우에는 Flatten 모드로 변경해서 만들면 된다.

 

 Interface 생성 

  • 이후 New - Class에서 Interface를 선택해 생성한다.
    • 회원을 저장하는 인터페이스와 id로 회원을 찾는 기능 두 가지 만들 것이다.
    • 인터페이스(MemberRepository)를 만들고 구현체(MemoryMemberRepository)를 만들어야 동작한다는 것을 기억하자.
    • 인터페이스와 구현체는 원래 다른 패키지로 구분하는게 좋은데 예제가 복잡해지므로 여기서는 그냥 같이 둔다.

 

  • 개발을 하며 빨간 줄이 뜨는 경우에는 대부분 alt + enter에서 옵션을 선택하면 해결된다.
    • 아래와 같이 import 문제가 많았고 모두 alt + enter로 해결됐다.

 

  • 또 참고로 ;까지 붙여서 바로 넘어가려면 tab 대신  ctrl + shift + enter를 누르면 된다.

 

 IntelliJ 설정 

  • 강사님이 단축키를 아주 많이 사용하셔서 편해보였는데 MAC 기준이라 Window 버전이 필요했다.
  • 다음과 같이 File - Settings에 들어가 Keymap에서 단축키를 확인하고 없는 것은 추가할 수 있다.

 

  • 또 IntelliJ는 기본 설정이 자동 저장이라 오류가 나기 쉬워보였는데 찾아보니 역시 Settings에서 자동 설정을 끄고 수정된 파일은 * 표시가 뜨도록 체크할 수 있었다.

 

 테스트 코드 

 

ctrl + alt + v

 

 

아직까지 스프링 관련 코드가 하나도 없어서 main 메소드로 확인하는 건 좋은 방법이 아니므로 이제 Junit이라는 테스트 프레임워크를 사용한다.

 

 

폴더 구조를 주의해야 하는 게 main이 아닌 test 폴더에 작성한다.

test 폴더는 말 그대로 테스트를 위한 곳이므로 나중에 빌드할 때 운영 환경에 포함되지 않는다.

 

 

주의 : 첫 번째 거가 아니라 두 번째 것 선택해야 함, 더 편리한 api가 많음

 

 

 

이렇게 모두 초록불이 들어오며 테스트 성공을 알 수 있음

 

 

2로 바꿔보면 오류가 뜨며 테스트에 fail한 것을 알 수 있다. 눈으로 직접 비교하는 게 아니라 틀린 부분을 바로 파악할 수 있음. 현대적인 코딩 방법에서 테스트 코드는 선택이 아니라 필수임.

 

 

 회원 도메인 설계의 문제점 

  • 이 코드의 설계상 문제점은 무엇일까?
  • 만약 다른 저장소로 변경할 때 OCP 원칙을 잘 준수할까?
  • DIP는 잘 지키고 있을까?
  • 답은 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다.
    • 주문까지 만들고 나서 문제점과 해결 방안을 알아보자.

  • 이 코드를 보면 MemberServiceImple은 MemberRepository와 MemoryMemberRepository를 둘 다 의존하는데 MemoryMemberRepository 구현체를 선택한 것은 상황에 따라 변할 수 있으므로 좋지 않은 설계이다.
    • 간단하게 추상화에도 의존하고 구체화에도 의존하는 상황이다.