Spring과 진짜 초면인 우리


Controller, Service, Repository 스프링 3계층 클래스
❶ 프로젝트 전체를 기반으로, 요기욧Controller / 요기욧Service / 요기욧Repository 이렇게 각 계층만 나누는 게 좋을까요?
❷ 도메인 별로, 음식Controller / 주문Controller ... 이런식으로 세세하게 나누는 게 좋을까요?
개인적인 의견)
➜ ❷ 도메인 별로 세세하게 나누는게 응집도가 높아지고 결합도는 낮아져서 유지보수하기 좋은 것 같아요~!
(번외로 규모가 많이 작다면 세세한 구분보다 전체적으로 흐름 파악하기 쉽게 계층만 나누는 것도 효율적인 느낌..?
이라 고려해볼 수 있지 않을까 싶기도..)

Controller에서 Service에게 일을 시키려면...
Service에서 Respository에게 일을 시키려면...
예를 들면~~
@Service 와 같은 어노테이션을 사용하여,
Controller-Service-Repository 클래스들이 서버가 시작될 때, 스프링 컨테이너 안에 스프링 빈으로 등록되도록 해보자구요
이제는 스프링 빈이기 때문에 직접 new 연산자를 통해 인스턴스화를 해줄 필요가 없어집니다!
스프링 컨테이너를 통해 인스턴스화도 이루어져요 🫰🏻
우리는 Controller와 Service가 직접 객체를 생성하는 것이 아니라, 스프링에게 의존성을 주입해달라고 대신 요청할텐데요 !
요청하는 방법 즉, DI를 구현하는 방법으로는 크게 아래 3가지가 있습니다
❶ 생성자 사용하기
❷ 어노테이션 사용하기
❸ Setter 사용하기
어떤 방법이 제일 괜찮아 보이는지 (또는 클린코드 관점인지) ..?
개인적인 의견)
➜ ❸ Setter 사용하기 :
Setter를 통한 주입 방식은 '런타임 시점'에 '의존성을 변경'할 수 있는 '유연성'을 제공하지만,
의존성이 런타임에 변경될 가능성이 낮은 경우에도 불필요한 코드가 추가된다던가,
다른 곳에서 Setter를 통해 접근하여 값을 변경하는 등의 의도치 않은 변경도 발생할 수 있어서 가급적 '지양하는 것'이 좋은 것 같아요..
➜ ❷ 어노테이션 사용하기 :
'필드에 직접적으로 주입'하는 방법인 @Autowired,
필드 위에 바로 @Autowired을 적어주면 되는데.. Setter를 사용하는 방법과 마찬가지로 기본적으로 '권장되지는 않는' 방법입니다!
필드에 바로 주입하게 되면 테스트가 어렵기도 합니다
(++ 추가로 Qualifier 어노테이션도 있습니다)
➜ ❶ 생성자 사용하기 :
위의 내용들과 반대로, 생성자를 통해 의존성을 주입하게되면 불변성을 보장하게 되고, 어떤 의존성을 을 주입해야 할 지 명확해집니다!
안정성과 가독성+유지보수성 챙겨가실 수 있겠죠!?
생성자를 통한 의존성 주입은 '컴파일 타임에 확인이 가능'합니다!! 런타임 시 의존성 주입 오류가 발생할 확률 줄어드는 소리 들려~~
끝으로, Spring Framework과 Spring Boot에서는 생성자를 이용한 DI를 권장하고 있으며,
필드 주입과 같은 다른 방식의 의존성 주입 방법은 권장하지않고 있다고 하네요!

'Spring과 진짜 초면인 우리들에게' 카테고리의 다른 글
| 객체의 불변성은 Builder 패턴으로 빌드업~! (0) | 2023.06.12 |
|---|---|
| [Optional 시리즈 1부] Optional 에 값이 있니? or ElseThrow ? (0) | 2023.05.22 |
| 00이/가 흘러다닐 길을 만들어 볼까요? REST API URL 규.칙. (2) | 2023.04.14 |
| API가 뷰(view)를 던진다구요...? 데이터만 던진다구요...? (4) | 2023.04.12 |
| @어노테이션@스프링 너무 많아 @ㅅ@ (0) | 2023.04.11 |