[워밍업 스터디 클럽 0기 BE] 3강 정리 및 공부

 

️강의 링크 - https://inf.run/XKQg

 

역할의 분리와 스프링 컨테이너

  • Clean Code는 왜 중요한가?

     

    : 코드는 요구사항을 표현하는 언어이다.

     

    : 클래스는 작아야 하며 하나의 책임만을 가져야 한다.

     

    : 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.

     

 

Controller의 함수 역할

  1. API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다.

  2. 현재 유저가 있는지, 없는지 등을 확인하고 예외 처리 해준다. --> service로 분리

  3. 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 가 포함되 있어서 어노테이션이 자동 감지

 

스프링 빈을 주입 받는 몇 가지 방법

  1. (가장 권장) 생성자를 이용해 주입받는 방식 (@Autowired 생략 가능)

image

  1. setter 와 @Autowired 사용 : 누군가 setter를 사용하면 오작동할 수 있다.

image

  1. 필드에 직접 @Autowired 사용 : 테스트를 어렵게 만드는 요인이다.

image

 

@Qualifier란?

여러가지 @Service 에서 가장 우선이 되게한다.

@Qualifier vs @Primary

: 사용하는 쪽에서 직접 적어준 @Qualifier가 이긴다

 

image

image따로 "main"이라고 선언하면 main으로 사용가능. 안할 시 "bananaService"라고 적어도 된다.

 

댓글을 작성해보세요.

채널톡 아이콘