본문 바로가기

Spring 3.0 - 4.3

[Spring] Spring의 의존성 주입이란 / 어노테이션이란

비즈니스 계층

비즈니스 계층은 고객의 요구사항을 반영하는 계층으로 프레젠테이션 계층과 영속 계층의 중간 다리 역할을 하게 됩니다. 일반적으로 비즈니스 영역에 있는 객체들은 '서비스(Service)'라는 용어를 많이 사용합니다.

 

 

 

 

일단, 비즈니스 계층을 위해서 프로젝트 내 com.exe.service라는 패키지를 작성합니다. 설계를 할 때 각 계층 간의 연결은 인터페이스를 이용해서 느슨한 연결을 합니다. Service 인터페이스와 그 인터페이스를 구현한 ServiceImpl 을 만들어줍니다.

 

 

 

SongVO.java (데이터객체)

package com.exe.domain;

import lombok.Data;

@Data
public class SongVO {
	
	private String song_key;
	private String song_title;
	private String rel_Date;
	private String youtube_link;
	private String album_key;
	
}

 

SongServiceImpl.java

package com.exe.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.exe.dao.SingerDAO;
import lombok.extern.log4j.Log4j;

@Service
@Log4j
public class SongServiceImpl implements SongService {
	
	@Autowired
    private SingerDAO singerDAO;

	@Override
	public Song getSong(String songKey) {
		return songDAO.getSongInfoTest(songKey);
	}

}

 

Impl클래스에 가장 중요한 부분은 @Service 입니다. @Service는 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해 사용합니다. 작성된 어노테이션은 패키지를 읽어 들이는 동안 처리됩니다. Impl 클래스가 정상적으로 동작하기 위해서는 Mapper 객체가 필요합니다.

 

 

 

 

참고로  @Component - 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시하는 어노테이션 입니다. 

 

 

 

비즈니스 계층의 인터페이스와 구현 클래스가 작성되었다면, 이를 스프링의 빈으로 인식하기 위해서 root-context.xml에 @Service 어노테이션이 있는 com.exe.service 패키지를 스캔하도록 추가해야 합니다.

root-context.xml 은 스프링 프레임워크에서 관리해야 하는 객체를 설정하는 설정 파일입니다.

 

 

프로젝트 생성 시 만들어진 root-context.xml의 네임스페이스 탭에서 context 항목을 추가합니다.

Namespace를 추가하면 해당 이름으로시작하는 태그들을 활용할 수 있습니다. 

 

 

root-context.xml의 일부

<context:component-scan base-package="com.exe.*" />

 

'Beans Graph' 탭을 선택해 보면 스프링이 관리하고 있는 Bean 객체들을 볼 수 있습니다.

 

 

스프링이 동작하면서 생기는 일 - 의존성 주입의 과정

1. 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역을 만들게 되는데 이를 컨텍스트(Context)라고 합니다. 스프링에서는 ApplicationContext라는 이름의 객체가 만들어 집니다.

2. 스프링은 자신이 객체를 생성하고 관리해야 하는 객체들에 대한 설정이 필요합니다. 이에 대한 설정이 root-context.xml 파일입니다.

3. root-context.xml 에 설정되어 있는 <context:component-scan> 태그의 내용을 통해서 해당 패키지를 스캔(scan)하기 시작합니다.

4. 해당 패키지에 있는 클래스들 중에서 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성합니다.

5. (위 코드에서) SongServiceImpl 객체는 SingerDAO 객체가 필요하다는 어노테이션(@Autowired) 설정이 있으므로, 스프링은
SingerDAO 객체의 레퍼런스를 SongServiceImpl 객체에 주입합니다.

 

이제 Mapper를 작성해봅시다.

 

sourceMapper.xml 에 추가되는 <select>

<select id="getSongInfo" resultType="com.exe.domain.SongVO" parameterType="String">
		SELECT
				SONG_KEY, SONG_TITLE, REL_DATE, YOUTUBE_LINK, ALBUM_KEY
		  FROM
		  		SONG
		 WHERE
		 		SONG_KEY = #{song_key, jdbcType=VARCHAR}
	</select>

MyBatis는 위에서 지정한 SongService 메소드의 리턴 타입에 맞게 select의 결과를 처리하기 때문에 

SONG 테이블의 모든 컬럼은 SongVO의 'song_title, song_key ...' 속성값으로 처리됩니다.

좀 더 엄밀하게 말하면 MyBatis는 위의 쿼리 결과에서 song_title 이라는 컬럼이 존재하면 인스턴스의 setSong_title(); 를 호출하게 됩니다. MyBatis의 모든 파라미터와 리턴 타입의 처리는 get 파라미터명(), set 컬럼명()의 규칙으로 호출됩니다.