스프링 (3)

💻 Programming

스프링 의존성 주입(DI)

스프링 의존성 주입 (Spring Dependency Injection)

스프링에서 의존성을 주입하는 방법은 현재 세 가지가 있습니다.

첫 번째는 생성자 주입 방식이고 두 번째는 Setter 주입 방식, 그리고 마지막으로 Field 주입 방식이 있습니다.

순서대로 한번 보도록 하겠습니다.

 

1. 생성자 주입 (Constructor Based Dependency Injection)

말 그대로 생성자에 @Autowired로 다른 빈을 주입하는 방식입니다.

@Controller
public class MyController {
    private MyService myService;
 
    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }
}

주입해야하는 빈이 많을 경우 생성자 자체가 커지게 됩니다. 그런경우 만약 lombok 을 사용한다면 아래처럼 작성할 수 있습니다.

@Controller
@RequiredArgsConstructor
public class MyController {

    private final MyService myService;
 
}

@RequiredArgsConstructor 어노테이션을 class 레벨에 붙여주고 주입할 빈은 final 키워드를 붙여주면 lombok에서 자동으로 생성자 주입을 이용하여 빈들을 주입해줍니다. 필요한 빈들은 모두 final 키워드를 붙여서 필드로 추가만 해주면 되죠. 

2. Setter 주입 (Setter Based Dependency Injection)

Setter 메서드를 이용하여 주입하는 방식이죠. 

@Controller
public class MyController {

    private MyService myService;
    
    @Autowired
    public void setMyService(MyService myService) {
        this.myService = myService;
    }
}

특이한 경우를 제외하고는 이 방식은 거의 사용하는 것을 못봤네요

3. Field 주입 (사용하지 마세요)

예전부터 많이 사용되는 방식입니다. 하지만 스프링에서 권고하지 않는 방식이기도 하죠. 

@Controller
public class MyController {

    @Autowired
    private MyService myService;
}

필드 주입 방식은 공식문서에도 소개조차 하고있지 않습니다. 공식문서에는 두 가지 방식만 있다고 설명합니다. 생성자 주입 방식과 setter 주입방식이죠. 그 이유는 필드 주입을 사용하게되면 순환참조 문제를 우회할 수 있게되어 순환참조를 고려하지 않고 개발을 하게되고, 그렇게 설계된 클래스는 하나 이상의 기능을 하게되어 하나의 책임만 가져야 한다는 Single Responsibility 원칙에 위배될 가능성이 높아지게되죠. 또 다른 여러 단점들에 대해서 stackoverflow를 참고하시면 좋을 것 같습니다. 만약 필드 주입을 사용하고 계시다면 생성자 주입 방식으로 바꿔주세요. 그러면 순환참조를 찾아낼 수 있고 순환참조 고리 안에 있는 클래스들을 살펴보면 Single Responsibility 원칙을 위배하는 클래스가 보일겁니다. 그런 것들은 클래스 분리를 통해 개선해주시면 됩니다.

 

 

 

 

 

참고문서

docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-dependencies

stackoverflow.com/questions/39890849/what-exactly-is-field-injection-and-how-to-avoid-it

 

 

 

💻 Programming/Java

이클립스에 스프링툴즈(STS) 설치하기

이클립스 스프링툴즈 설치방법

이번에는 이클립스에서 스프링부트를 사용하기위한 스프링툴즈 설치방법을 알아볼게요.

이클립스가 설치완료되었다는 가정하에 아래 순서대로 진행하시면됩니다.

 

1. 이클립스 상단 메뉴에서 Help > Eclipse Marketplace... 선택합니다.

 

 

2. 검색창에 spring 으로 검색한 뒤 제일 상단에 Spring Tools (aka Spring Tools Suite) 가 보이면 install 버튼 클릭 (2020년 7월 현재 최신 버전은 4.7.0.RELEASE)

만약 4.7.0 버전이 보이지 않는다면 이클립스 버전이 오래된 건 아닌지 확인해보시고 최신 버전으로 이클립스를 다시 다운받아 설치하신 뒤 진행하시기 바랍니다.

 

3. required 항목만 남기고 나머지는 체크 해제합니다.

 

4. 라이센스 동의를 선택하고 Finish 버튼을 클릭합니다.

이상으로 이클립스에서 스프링부트를 쉽게 사용할 수 있도록 해주는 유용한 플러그인 스프링 툴즈 설치방법에 대한 포스팅을 마칩니다.

스프링 웹 개발을 하다보면 상당히 많은 에러 메시지와 마주하게 됩니다.


특히 개발 환경을 구성할 때 자주 보게 되죠.


최근에 개인적으로 스프링 웹 개발 환경을 구성을 해보다가 다음과 같은 에러 메시지를 보게 되었습니다.


No converter found for return value of type: class java.util.ArrayList


스프링 메이븐 프로젝트로 구성을 했구요, 스프링 버전은 4.3.2 버전이었습니다.


pom.xml 에 jackson-core 라이브러리를 디펜던시 목록에 추가해놓은 상태여서 당연히 될 거라고 생각했었는데 에러가 발생하더군요.


스프링 컨트롤러에서 @ResponseBody 어노테이션을 사용해서 List<Dto> 를 반환하려고 할 때 발생한 에러입니다.


구글링을 해보니 해결 방법은 간단합니다.


jackson-bind 라이브러리를 추가해주는 겁니다.


그래서 아래 디펜던시 부분을 추가를 해서 해결했습니다.


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

  <artifactId>jackson-databind</artifactId>

<version>2.5.4</version>

</dependency>



@ResponseBody 어노테이션을 사용하려면 jackson-bind 라이브러리가 필요하다는 것을 알게되었네요~


역시 누가 구성해놓은 환경에서만 개발을 하다가 혼자서 하려니 이런저런 다양한 케이스들을 많이 보게 되는 것 같습니다.