회원 정보를 관리하는 UserService 컴포넌트를 추가로 개발해보자.
이번에는 어노테이션을 사용하지 않고, Setter 인젝션으로 의존성 주입을 처리하고 나서 어노테이션으로 변경한다.
UserService 컴포넌트
- UserVO
- UserDAO
- UserService
- UserServiceImpl
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;
}
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;
}
}
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);
}
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;
}
}
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" />
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을(를) 찾거나 로드할 수 없습니다.
=> 패키지가 길어서 제대로 인식하지 못하는 오류. 패키지 없이 그냥 디폴트 패키지에 파일 넣고 실행했더니 실행된다.
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프로그램 실행.