삽질블로그

스프링 컴포넌트 스캔 @Conponent, @Controller, @Service, @Repository, Autowired 어노테이션 본문

자바스프링

스프링 컴포넌트 스캔 @Conponent, @Controller, @Service, @Repository, Autowired 어노테이션

삽질블로그 2022. 9. 26. 11:45

전에 나는 자바에서 프로젝트를 진행했었는데, 순수 자바로 코드를 작성했을 때는

서로 다른 클래스에서 같은 하나의 객체를 생성하는 것이 불필요하므로 인자를 통해 넘겨주는 방식으로 작성을 했다.

 

예를 들어 test1, test2, test3 클래스가 있고

각각 test1, test2클래스에서 test3 클래스를 사용하고 싶을 때 

package com.example.springStudy.controller;

public class test1 {
    test3 test = new test3();
}
package com.example.springStudy.controller;

public class test2 {
    test3 test = new test3();
}

이렇게 각 클래스마다 객체를 생성해서 사용하면 데이터가 손상될 수 있기 때문에 지양하는 방식이라고 들었다.

그래서 나는 코드를 이렇게 작성했었다.

 

package com.example.springStudy.controller;

public class test1 {
    test3 test = new test3();
    test2 Test2 = new test2(test);
}
package com.example.springStudy.controller;

public class test2 {
    test3 test;
    public test2(test3 test){
        this.test = test;
    }

}

이렇게 객체를 한 번 생성하면 다른 클래스에서 사용할 때 인자로 넘겨주면서 사용해야지 데이터가 초기화되지도 않고,

잘못하다가 서로 객체를 무한히 생성해서 프로그램이 터지는 일이 발생하지 않는다.(내가 그랬음)

 

근데 스프링에서는 이것을 다 관리해준다는게 너무 신기했다.

스프링에서 클래스 상단에 @Component 어노테이션이 있으면 스프링 컨테이너에 스프링 빈으로 자동으로 등록이 되는데,

@Conponent 어노테이션을 포함하는 것들은 다음이 있다.

@Controller

@Service

@Repository

 

그럼 이런 어노테이션을 어떻게 사용해야 할까?

내가 UserController에서 UserService를 사용하고 싶고,

UserService에서 UserRepository를 사용하고 싶을 때

각각 이렇게 작성해주면 된다.

 

UserController.class

@Controller
public class UserController {
    UserService userService;

    @Autowired
    public UserController(UserService userService){
        this.userService = userService;
    }
}

UserRepository.class

@Repository
public class UserRepository implements UserRepositoryInterFace {
}

UserService.class

@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

}

@Component가 들어있는 있는 어노테이션들을 클래스 위에서 선언해주면 스프링 컨테이너에

객체가 스프링 빈으로 등록이 되는데,

이를 @Autowired어노테이션을 통해 등록된 스프링 빈을 사용할 수 있다.

이를 디펜던시 인젝션(의존성 주입)이라고 한다.

 

순수 자바를 사용한 프로젝트에선 각 객체를 인자를 통해 전달했었는데,

스프링에선 스프링 컨테이너에 스프링 빈을 등록만 한다면

이렇게 쉽게 주입을 받을 수 있다는 것이 너무 편한 것 같다.

바로 전 프로젝트에선 스프링 컨테이너, 스프링 빈, 어노테이션 등 각 개념을 모르는 상태로 코드를 짜느라 바빠

이해를 하지 못했는데, 프로젝트가 끝나고 다시 공부하니 더 쉽게 와닿는 것 같다.

 

참고자료 : 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

Comments