본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

[Spring] 7장 비즈니스 컴포넌트 실습 2 - 스프링 프레임워크로 회원 상세 조회 및 로그인 기능 프로그램 만들기 (USER 테이블 / Setter 인젝션 사용)

by 달님🌙 2021. 10. 27.
반응형

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

7.1절 UserService 컴포넌트 구조

 

1. UserService 컴포넌트에 대한 클래스 다이어그램 ( _023_BoardWeb_Business_User )

 

 

2. UserService 컴포넌트 관련 파일 작성 위치

 

 

 

7.2절 Value Object 클래스 작성

 

1. 데이터베이스 User 테이블 구조

 

CREATE TABLE USERS(
	ID VARCHAR(8) PRIMARY KEY,
    PASSWORD VARCHAR(8),
    NAME VARCHAR(20),
    ROLE VARCHAR(5)
);

INSERT INTO USERS VALUES('test', 'test123', '관리자', 'Admin');
INSERT INTO USERS VALUES('user1', 'user1', '홍길동', 'User');

 

2. VO 클래스

 

- 변수 선언 후 Getter/Setter 메소드와 toString() 메소드 추가

package com.springbook.biz.user;

public class UserVO {
	private String id;
	private String password;
	private String name;
	private String role;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	@Override
	public String toString() {
		return "UserVO [id=" + id + ", password=" + password + ", name=" + name + ", role=" + role + "]";
	}

}

 

 

7.3절 DAO 클래스 작성

 

3. DAO (Data Access Object) 클래스 작성

 

- JDBCUtil 클래스를 이용하여 메소드 구현

- 회원 상세 조회 

- 어노테이션 설정 대신 <bean> 등록으로 객체 생성 예정

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;

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 {
			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(stmt, conn);
		}
		return user;
	}
}

 

 

7.4절 Service 인터페이스 작성

 

package com.springbook.biz.user;

public interface UserService {
	//CRUD 기능의 메소드 구현
	//회원 상세 조회
	public UserVO getUser(UserVO vo);
}

 

 

7.5절 Service 구현 클래스 작성

 

- UserServiceImpl : UserService 인터페이스를 구현한 클래스

- 멤버변수로 선언된 UserDAO 객체를 이용하여 DB 연동을 처리한다

- Setter 인젝션 처리를 위해 Setter 메소드가 추가됨

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;
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}


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

 

 

7.6절 UserService 컴포넌트 테스트

 

1. 스프링 설정 파일 수정

 

- 이번에는 어노테이션을 사용하지 않고 설정 파일에 bean 객체로 객체 자동 생성하도록 할 예정

- 의존성 주입도 설정파일에 <property>에 넣어서 자동적으로 의존성 주입이 되도록 설정

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

<!-- 위에 ref에 들어갈 userDAO 객체 만듬 -->
<bean id="userDAO" class="com.springbook.biz.user.impl.UserDAO"></bean>

 

2. 클라이언트 작성 및 실행

 

package com.springbook.biz.user;

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

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

 

3. 실행 결과

 

 

 

7.7절 어노테이션 적용으로 변경해보기

 

1. 스프링 설정 파일 수정 ( _024_BoardWeb_Business_User_Annotation )

 

- Setter 인젝션 관련 설정 <bean> 태그 모두 지우기

- 컴포넌트 스캔의 범위를 com.springbook.biz 패키지로 지정

- UserServiceImpl 클래스와 UserDAO 클래스도 스캔 범위에 포함되므로 객체가 생성되고 의존성 주입도 처리됨

<context:component-scan base-package="com.springbook.biz"></context:component-scan>

 

2. 각 클래스에 어노테이션 추가해주기

 

1) UserServiceImpl 클래스에는 @Service 어노테이션 추가

- UserDAO 객체를 찾을 수 있도록 @Autowired 어노테이션 추가

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

 

2) UserDAO 클래스에는 @Repository 어노테이션 추가

@Repository("userDAO")
public class UserDAO {
	...
}

 

3. 실행 결과

 

 

 

반응형

댓글