2021-04-01(Thu)

항목

내용

학습 날짜

2021-04-01(목)

학습 시간

11:00~23:00

학습 범위 및 주제

spring

학습 목표

spring을 학습하자!

동료 학습 방법

-

상세 학습 내용

스프링 빈과 의존관계

스프링은 스프링 컨테이너가 생성될 때, 객체 인스턴스를 '스프링 빈'이라는 이름으로 생성하고 관리한다. 생성자에 @Autowired가 연관된 스프링 빈을 스프링 컨테이너에서 찾아서 넣어준다. 의존성 주입을 프레임워크 차원에서 편하게 해주는 셈. 참고로 @Autowired 를 통한 DI는 helloController, memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

스프링 빈은 두 가지 방법으로 등록할 수 있다.

  1. 컴포넌트 스캔과 자동 의존관계 설정

    • @Component 어노테이션이 있으면 스프링 빈으로 자동 등록된다. @Controller, @Service, @Repository 도 내부 코드를 뜯어보면 @Component 어노테이션을 포함하고 있다.

    • 이렇게 등록되는 스프링 빈 객체는 기본적으로 싱글톤이다. (설정으로 바꿀 수 있긴 함)

    • 참고로 컴포넌트 스캔은 @SpringBootApplication 어노테이션이 정의된 클래스가 속한 패키지의 하위 요소들이 대상이다.

  2. 자바 코드로 직접 스프링 빈 등록하기

    • @Configuration 어노테이션과 함께 설정 클래스를 생성한다. 이 때 @Bean 어노테이션으로 스프링 빈 객체를 생성한다.

    • 메모리 리포지토리를 다른 리포지토리로 변경하는 등의 객체변경시 수정해야할 코드가 컴포넌트 스캔 방식에 비해 적다는 장점이 있다.

스프링에서 의존성 주입 방식 3가지

  • 필드 주입

    • 주입시 설정을 디테일하게 바꾸기 어려으므로 권장되지 않는다.

  • setter 주입

    • 의존관계가 실행 중에 동적으로 변하는 경우가 거의 없는 반면, setter 주입은 동적 변경할 여지를 남기기 때문에 권장되지 않는다.

  • 생성자 주입

    • 실무에서 가장 권장되는 방식이다.

rails와 비슷하면서 달라서 흥미로운 것들이 있다. rails에서는 엔드포인트들을 route.rb 파일에 명시한 반면, 스프링은 파일마다 어노테이션으로 맵핑한다. 그리고 재밌게도, rails에서는 어떤 요청이 들어오든 params 객체를 호출해서 query나 body에 포함된 값을 key 값을 인덱스 삼아 value를 확인할 수 있었다. 반면 스프링부트에서는 key 값에 대응하는 프로퍼티를 가진 객체를 만들어서 요청을 받는다. 이건 개인적으론 생산성 저하 요인이 될 수 있겠다 싶지만, 엔드포인트와 연결된 메서드 내에서만 조작될 수 있도록 제한하기 편하겠다 싶다. 편의성 vs 안정성이랄까. 그리고 rails에서는 DB migrate 내역을 남길 수 있게끔 커맨드 기반으로 DB 테이블을 조작한다. 반면 spring boot는 DB migrate 내역은 셀프로 남겨야하는듯 하다. 그냥 기초적인 spring boot 예제여서 그런가?

학습 내용에 대한 개인적인 총평

흠 재밌긴한데 갈길이 멀다!

다음 학습 계획

  • 디자인패턴 학습

Last updated