서버/Spring

Spring 프레임워크 (간단한 User DAO) (리펙토링,메소드 추출)

피노키오이 2020. 1. 2. 19:48
반응형

개요

 

이번에는 자바 백앤드 개발을 하기 위해서 가장 많이 쓰이는 프레임워크인 스프링을 이해하기 위해  오브젝트 설계와 구현, 동작원리에 대해서 더 자세하게 다루어 보도록 하겠습니다.

 


설명

 

DAO(Data Access Object)는 DB를  사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트입니다.

 


1. mysql을 통해서 user table을 만들어 줍니다.

 

mysql user 테이블

 


2, UserClass 를 만들어 줍니다.

 

이 UserClass는 id,name,password 세 개의 프로퍼티를 가진 User 클래스입니다.

public class User {
	String id;
	String name;
	String password;
	
	public String getID() {
		return id;
	}
	
	public void setID(String id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getPassword() {
		return password;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}
	
}

 


3. UserDao 생성

 

사용자 정보를 관리하는 DAO이므로 UserDao라는 이름으로 클래스를 하나 생성합니다. 

사용자의 정보의 등록,수정,삭제의 기능을 만들어야 하지만 간단하게 사용자를 생성하고 조회하는 두 개의 메서드를 먼저 만들어 보겠습니다.

JDBC를 이용하는 작업의 일반적인 순서는 다음과 같습니다.

1. DB 연결을 위한 Connection을 가져옵니다.

2. SQL을 담은 Statement(또는 PreparedStatement)를 만듭니다.

3. 만들어진 Statement를 실행합니다.

4. 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트(여기서는 User)에 옮겨줍니다.

5. 작업 중에 생성된 Connection,Statement,ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아 줍니다.

6. JDBC API가 만들어내는 예외를 잡아서 직접처리하거나, 메서드에 throws를 선언해서 예외가 발생하면 메서드 밖으로 던지게 합니다.

 

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





public class UserDao {
	
	public void add(User user) throws ClassNotFoundException,SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","wlfkf123");
		
		PreparedStatement ps  = c.prepareStatement("insert into user (id,name,password) values(?,?,?)");
		ps.setString(1, user.getID());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());
		
		ps.executeUpdate();
		
		ps.close();
		c.close();
	}
	
	public User get(String id) throws ClassNotFoundException,SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","wlfkf123");
		
		PreparedStatement ps = c.prepareStatement("select * from user where id = ?");
		ps.setString(1, id);
		
		ResultSet rs = ps.executeQuery();
		rs.next();
		User user = new User();
		user.setID(rs.getString("id"));
		user.setName(rs.getString("name"));
		user.setPassword(rs.getString("password"));
		
		rs.close();
		ps.close();
		c.close();
		
		return user;
	}
	
}

 


4. 검증하기 위한 main함수를 만들어 DAO를 테스트 합니다.

 

import java.sql.SQLException;

public class main {

	public static void main(String[] args) throws ClassNotFoundException,SQLException {
		UserDao dao = new UserDao();
		
		User user = new User();
		user.setID("JUNG");
		user.setName("정성현");
		user.setPassword("1234");
		
		dao.add(user);
		
		System.out.println(user.getID() + "등록 성공");
		
		User user2 = dao.get(user.getID());
		System.out.println(user2.getName());
		System.out.println(user2.getPassword());
		System.out.println(user2.getID() + "조회 성공");
	}

}

 

main의 결과

 

위에서 만든 java코드는 간단하게 만든 것임에도 불구하고 중복된 코드들이 있습니다. 

그 중복된 코드들을 변경해 보도록 하겠습니다.

public class UserDao {
	
	public void add(User user) throws ClassNotFoundException,SQLException {
		Connection c= getConnection();
		
		PreparedStatement ps  = c.prepareStatement("insert into user (id,name,password) values(?,?,?)");
		ps.setString(1, user.getID());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());
		
		ps.executeUpdate();
		
		ps.close();
		c.close();
	}
	
	public User get(String id) throws ClassNotFoundException,SQLException {
		Connection c= getConnection();
		
		PreparedStatement ps = c.prepareStatement("select * from user where id = ?");
		ps.setString(1, id);
		
		ResultSet rs = ps.executeQuery();
		rs.next();
		User user = new User();
		user.setID(rs.getString("id"));
		user.setName(rs.getString("name"));
		user.setPassword(rs.getString("password"));
		
		rs.close();
		ps.close();
		c.close();
		
		return user;
	}
	
	public Connection getConnection() throws ClassNotFoundException,SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","wlfkf123");
		return c;
	}
	
}

 

이렇게 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 리펙토링이라고 합니다.

이러한 리펙토링에서 공통의 기능을 하는 중복된 코드를 뽑아내는 것을 메서드 추출이라고 합니다.

저는 더 좋은 개발자가 되기 위해 이러한 작업을 항상 생각하면서 개발해야 한다고 생각합니다 ㅎㅎ

 

사실 위에서 만든 java코드는 완전히 불완전한 상태입니다. ㅎㅎ

다음번에 계속해서 사용하기 위해서 만든 것이며 이 DAO 코드를 Spring 스타일의 코드로 바꾸어 보는 작업을 해보도록 하겠습니다.

 


 

반응형