[워밍업 스터디 클럽 0기 BE] 3강 정리 및 공부
✏ ️강의 링크 - https://inf.run/XKQg
역할의 분리와 스프링 컨테이너
Clean Code는 왜 중요한가?
: 코드는 요구사항을 표현하는 언어이다.
: 클래스는 작아야 하며 하나의 책임만을 가져야 한다.
: 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.
Controller의 함수 역할
API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다.
현재 유저가 있는지, 없는지 등을 확인하고 예외 처리 해준다. --> service로 분리
SQL을 사용해 실제 DB와의 통신을 담당한다. --> repository로 분리
즉 , Controller의 역할을 3가지로 분리 = > Layered Architecture
UserController와 스프링 컨테이너
: static이 아닌 코드를 사용하려면 인스턴스화가 필요하다.
Controller는 인스턴스를 어떻게하고있는가
=> @RestController 어노테이션
UserController 클래스를 스프링 빈으로 등록시킨다.
: UserController는 JdbcTemplate이 필요하다.
=> 즉, JdbcTemplate에 의존하고 있다. (JdbcTemplate이 없으면 동작하지 않는다)
스프링 빈이란?
: 스프링 부트 서버가 시작되면, 스프링 서버 내부에 건대한 컨테이너를 만들게 된다.
컨터이너 안에는 여러 클래스가 들어가게 된다. 들어간 클래스를 스프링 빈 이라고 한다.
JdbcTemplate도 이미 스프링 빈 안에 들어가있다.
다양한 정보와 함께 인스턴스화도 이루어진다. => (타입 : UserController , 이름 : userController)
JdbcTemplate은 우리가 가져온 Dependency가 등록해주고 있다.(build.gradle - dependencies)
서버 시작 시
1) 스프링 컨테이너(클래스 저장소)가 시작
2) 기본적으로 많은 스프링 빈들이 등록
3) 우리가 설정해준 스프링 빈이 등록
4) 필요한 의존성이 자동으로 설정
but, UserRepository는 JdbcTemplate을 가져오지 못하는 가
=> JdbcTemplate을 가져오려면 UserRepository가 스프링 빈이 아니라 그냥 클래스이기 때문
@Repository / @Service
Repostitory를 다른 Class로 변경해도 Service를 변경하지 않는 방법
=> interface를 활용
코드를 단 한 줄도 바꾸지 않고 요구 사항을 변경할 수 있을까
=> 스프링 컨테이너
: 컨테이너가 선택해 BookService에 넣어주는 과정을 의존성 주입(DI, Dependency Injection)라고 한다.
이런 방식을 제어의 역전(Ioc) 이라고 한다.
@Repository 가 두개면 @Primary를 사용할 곳에 붙여주면된다.
@Primary : 우선권을 결정하는 어노테이션
빈을 등록하는 방법
@Configurartion
: 클래스에 붙이는 어노테이션
: @Bean을 사용할 때 함께 사용해 주어야 한다.
@Bean
: 메소드에 붙이는 어노테이션
: 메소드에서 반환되는 객체를 스프링 빈에 등록한다.
언제 @Service, @Repository를 사용해야 할까?
: 개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때!
언제 @Configuration + @Bean을 사용해야 할까?
: 외부 라이브러리, 프레임워크에ㅓㅅ 만든 클래스를 등록할 때!
@Component
: 주어진 클래스를 '컴포넌트'로 간주한다.
: 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.
@RestController , @Service 등 안에 @Component 가 포함되 있어서 어노테이션이 자동 감지
스프링 빈을 주입 받는 몇 가지 방법
(가장 권장) 생성자를 이용해 주입받는 방식 (@Autowired 생략 가능)
setter 와 @Autowired 사용 : 누군가 setter를 사용하면 오작동할 수 있다.
필드에 직접 @Autowired 사용 : 테스트를 어렵게 만드는 요인이다.
@Qualifier란?
여러가지 @Service 에서 가장 우선이 되게한다.
@Qualifier vs @Primary
: 사용하는 쪽에서 직접 적어준 @Qualifier가 이긴다
따로 "main"이라고 선언하면 main으로 사용가능. 안할 시 "bananaService"라고 적어도 된다.
댓글을 작성해보세요.