일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 동시성 문제
- nestjs
- docker
- 스프링
- 스프링기초
- 대규모 트래픽
- nestjs 예외
- 동시성문제
- nginx
- connection reset by peer
- Jenkins
- JavaScript
- 토스팀
- nodejs
- 분산시스템
- 트러블슈팅
- 스프링오류
- 3WayHandshake
- 유난한 도전
- OS
- 동시성 제어
- 스프링 이미지
- 스프링Entity
- 스프링jpa
- 예외 커스텀
- 토스책
- 자바
- 예외 핸들링
- Mysql이미지
- 예외필터
- Today
- Total
삽질블로그
스프링 컴포넌트 스캔 @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 접근 기술
'자바스프링' 카테고리의 다른 글
Unknown Entity, JPA 엔티티 인식 오류 (0) | 2022.12.12 |
---|---|
회원관리 예제 Test코드 작성 (0) | 2022.09.25 |
스프링 회원관리 예제 (0) | 2022.09.25 |
스프링 기초 (0) | 2022.09.19 |
[Android] 자바 스프링으로 이미지 Mysql에 전송 및 저장하기 (2) (0) | 2022.09.18 |