Spring | 스프링 퀵 스타트 | 비즈니스 컴포넌트 실습 2/2

파과·2022년 8월 11일

회원 정보를 관리하는 UserService 컴포넌트를 추가로 개발해보자.
이번에는 어노테이션을 사용하지 않고, Setter 인젝션으로 의존성 주입을 처리하고 나서 어노테이션으로 변경한다.

UserService 컴포넌트

  1. UserVO
  2. UserDAO
  3. UserService
  4. UserServiceImpl

Value Object 클래스

package com.springbook.biz.user;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

//VO(Value Object)
@Getter
@Setter
@ToString
public class UserVO {

	private String id;
	private String password;
	private String name;
	private String role;
}

UserDAO 클래스

package com.springbook.biz.user.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.springbook.biz.common.JDBCUtil;
import com.springbook.biz.user.UserVO;

// DAO(Data Access Object)
public class UserDAO {
	// JDBC 관련 변수
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	// SQL 명령어들
	private final String USER_GET = "select * from users where id=? and password=?";

	// CRUD 기능의 메소드 구현
	// 회원 등록
	public UserVO getUser(UserVO vo) {
		UserVO user = null;
		try {
			System.out.println("===> JDBC로 getUser() 기능 처리");
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(USER_GET);
			stmt.setString(1, vo.getId());
			stmt.setString(2, vo.getPassword());
			rs = stmt.executeQuery();
			if (rs.next()) {
				user = new UserVO();
				user.setId(rs.getString("ID"));
				user.setPassword(rs.getString("PASSWORD"));
				user.setName(rs.getString("NAME"));
				user.setRole(rs.getString("ROLE"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return user;
	}
}

Service 인터페이스

  • DAO클래스에서 Alt + Shift + T → Extract Interface 선택
  • 이름 UserService
  • Select All
  • @Override 체크 안함

UserDAO implements 코드 지워주기!
com.springbook.biz.user 패키지로 옮기기

package com.springbook.biz.user;

import com.springbook.biz.user.UserVO;

public interface UserService {

	// CRUD 기능의 메소드 구현
	// 회원 등록
	UserVO getUser(UserVO vo);

}

Service 구현 클래스 UserServiceImpl

package com.springbook.biz.user.impl;

import com.springbook.biz.user.UserService;
import com.springbook.biz.user.UserVO;

public class UserServiceImpl implements UserService {
	
	private UserDAO userDAO;

	@Override
	public UserVO getUser(UserVO vo) {
		return userDAO.getUser(vo);
	}
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

}



UserService 컴포넌트 테스트하기

1. applicationContext.xml파일에 다음 코드 작성

<bean id="userService" class="com.springbook.biz.user.impl.UserServiceImpl">
	<property name="userDAO" ref="userDAO" />
</bean>

<bean id="userDAO" class="com.springbook.biz.user.impl.UserDAO" />

2. UserServiceClient 작성

package com.springbook.biz.user;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class UserServiceClient {

	public static void main(String[] args) {
		//1. Spring 컨테이너를 구동한다.
		AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
		
		//2. Spring 컨테이너로부터 UserServiceImpl 객체를 Lookup한다.
		UserService userService = (UserService) container.getBean("userService");
		
		//3. 로그인 기능 테스트
		UserVO vo = new UserVO();
		vo.setId("test");
		vo.setPassword("test123");
		
		UserVO user = userService.getUser(vo);
		if(user != null) {
			System.out.println(user.getName() + "님 환영합니다.");
		}else {
			System.out.println("로그인 실패");
		}
		
		//4. Spring 컨테이너를 종료한다.
		container.close();
	}
}

기본 클래스 test com.springbook.biz.user.UserServiceClient을(를) 찾거나 로드할 수 없습니다.
=> 패키지가 길어서 제대로 인식하지 못하는 오류. 패키지 없이 그냥 디폴트 패키지에 파일 넣고 실행했더니 실행된다.

3. 어노테이션 적용

Setter 인젝션 설정으로 테스트한 UserService 컴포넌트를 어노테이션 설정으로 변경해보자.
스프링 설정 파일에 Setter 인젝션 관련 설정을 주석처리한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<context:component-scan base-package="com.springbook.biz"></context:component-scan>
	
	<!-- Setter 인젝션 관련 설정 주석처리 -->
<!--	
	<bean id="userService" class="com.springbook.biz.user.impl.UserServiceImpl">
		<property name="userDAO" ref="userDAO" />
	</bean>
	
	<bean id="userDAO" class="com.springbook.biz.user.impl.UserDAO" />

-->

</beans>

UserServiceImpl과 UserDAO에 관련된 어노테이션을 추가한다.

UserServiceImpl.java

package com.springbook.biz.user.impl;

import com.springbook.biz.user.UserService;
import com.springbook.biz.user.UserVO;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {
	@Autowired	
	private UserDAO userDAO;

	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	public UserVO getUser(UserVO vo) {
		return userDAO.getUser(vo);
	}
}

UserDAO.java

package com.springbook.biz.user.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.springframework.stereotype.Repository;

import com.springbook.biz.common.JDBCUtil;
import com.springbook.biz.user.UserVO;

// DAO(Data Access Object)
@Repository("userDAO")
public class UserDAO {
	// JDBC 관련 변수
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	// SQL 명령어들
	private final String USER_GET = "select * from users where id=? and password=?";

	// CRUD 기능의 메소드 구현
	// 회원 등록
	public UserVO getUser(UserVO vo) {
		UserVO user = null;
		try {
			System.out.println("===> JDBC로 getUser() 기능 처리");
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(USER_GET);
			stmt.setString(1, vo.getId());
			stmt.setString(2, vo.getPassword());
			rs = stmt.executeQuery();
			if (rs.next()) {
				user = new UserVO();
				user.setId(rs.getString("ID"));
				user.setPassword(rs.getString("PASSWORD"));
				user.setName(rs.getString("NAME"));
				user.setRole(rs.getString("ROLE"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return user;
	}
}

저장 후 UserServiceClient프로그램 실행.

0개의 댓글