스프링에서 객체화를 담당하는 컨테이너에 대해 알아보려고 한다.
객체화를 담당하는 명령어는 두가지로,
- .xml -->> <bean> 태그로 객체화
- @(어노테이션) 으로 객체화
위 두가지의 특징
.xml <bean> : 계속 바꿔야하는 객체들에게 객체화를 진행
1. 설정이 과다해짐
2. 가독성이 떨어짐
3. 구조 파악이 어려움
@(어노테이션) : 한번 설정하면 안바뀌는 객체들에게 객체화 진행
1. 설정을 .java 파일에서 진행하는 방법
2. JAVA의 구조 파악에 도움을 줌
3. .xml이 줄어듦 --> 가독성이 좋아짐 (MVC 패턴 구분)
* 참고
GalaxyPhone 클래스를 만들었다는 가정 하에 객체 선언 방법은 3가지가 있다.
GalaxyPhone gp = new Galaxyphon();
<bean class="test.GalaxyPhone" id="gp" />
@Component("gp")
어노테이션을 사용하려면 '네임스페이스' 가 필요하다. 사용 방법은 EL 표현식을 사용하기 위해 JSTL 링크를 사용했던 것처럼 @(어노테이션)을 사용하려면 네임스페이스에서 context를 추가해야 사용할 수 있다. 추가하는 방법은 아래와 같다.
먼저, web.xml 파일에서 아래와 같이 파일을 수정한다.
이와 같이 수정하는 이유는 DispatcherServlet이라는 .xml 파일에서 @(어노테이션)이 있는 파일들을 모두 스캔하기 위한 작업이다.
(' .do로 적혀있는 코드를 모두 스캔해줘!! ' 를 실행하기 위해)
다음으론 webapp --> WEB-INF --> DispatcherServlet-servlet.xml 파일을 생성한다.
하단에 있는 Namespaces를 클릭한다.
다음으론 beans 와 context 를 클릭하여 활성화 시켜준 후 다시 하단의 Source 파일로 돌아온다.
그럼 <context> 태그를 제외한 다른 코드들이 추가가 되는데 <beans> 태그 안에 scan을 하기 위해 <context> 태그를 추가하고 scan할 패키지명을 코드로 작성하면 설정은 끝이다 !
다음으론 controller 에서 적용 시키는 방법이다.
먼저 Service interface를 만들어야 한다. interface를 만드는 이유는 다형성을 유지해 유지보수에 유리하도록 설정하기 위함이다.
다음으로 생성된 파일에서 다형성을 유지할 때 필요한 메소드들을 만든다. (작성자는 MVC 패턴을 사용하기 위해서 CRUD 형식으로 작성하였음.)
다음으론 BoardServiceImpl POJO 클래스를 생성한 후 implements 를 통해 BoardService의 요소들을 강제 구현할 수 있도록 한다.
또한, BoardDAO를 사용하기 위해 멤버변수로 BoardDAO를 선언하고, 이 때 BoardDAO가 Service의 주체가 되므로 의존 주입이 필요하다. 따라서 의존 주입도 같이 진행한다.
그 후 미리 만들어 놓았던 BoardDAO 파일에 @Repository를 추가하면 관계 주입이 완전히 끝나게 된다.
각 어노테이션에서 발생할 수 있는 예외
1) @Component
NPE (NullPointerException)
의존관계를 가진 'B' 객체가 DI 되지 않았기 때문에 오류가 발생할 수 있음
2) @Autowired
BCE (BeanCreationException) [ 객체가 없거나 2개 이상일 때 ]
메모리에 'B' 와 같은 자료형을 가진 객체가 없어서 오류가 발생할 수 있음
따라서 메모리에 'B' 와 같은 자료형을 가진 객체를 생성하면 된다. 이는 DispatcherServlet-servlet.xml 파일에서 <bean>태그를 통해 생성하거나, @(어노테이션)을 통해 객체를 생성할 수 있다.
만약 메모리에 'B' 가 두개 이상이라면 ?
--> 스프링 컨테이너가 자료형을 보고 작업 처리를 하기 때문에 에러가 발생한다. (결론: 한개의 객체만 생성해야 함)
따라서 .xml 과 @(어노테이션)을 한가지의 종류만 사용하는 것이 아닌 두개의 경우 모두 혼합하여 적절히 사용하는 것이 중요하다 !
'Spring' 카테고리의 다른 글
[Spring] ViewResolver (0) | 2023.08.09 |
---|---|
[Spring] 맥(MAC) 오라클(디비버) 설치 및 연결 방법 (0) | 2023.08.08 |
[Spring] 의존성(Dependency), 의존 관계 주입(Dependency Injection) (0) | 2023.08.05 |
[Spring] 스프링 프레임워크 (0) | 2023.08.04 |
[Spring] 맥(MAC) 매번 해야 하는 Spring Legacy Project 초기 세팅 방법 (1) | 2023.08.03 |