///////
Search
🦁

김건우

서비스와 클라이언트

두 개의 오브젝트가 존재하고 한 오브젝트가 다른 오브젝트의 기능을 사용한다면, 사용되는 쪽이 사용하는 쪽에게 서비스를 제공하는 것이다. 따라서 사용되는 오브젝트를 서비스라하고 사용하는 오브젝트를 클라이언트라고 부를 수 있다.

오브젝트 사이의 관계

런타임 시에 한쪽이 다른 오브젝트의 레퍼런스를 갖고 있는 방식으로 만들어진다.
userDao가 DConnectionMaker를 사용함으로서 이 두개의 오브젝트가 사용이라는 관계를 맺게 해준다
--> 여기에서는 DconnectionMaker가 서비스 userDao가 클라이언트이다. class userDao{ connetionMaker = new DconnectionMaker(); ... }
Java
복사

팩토리 클래스

팩토리 클래스의 주 목적은 객체의 생성방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것이다. 다른 말로 말하자면 오브젝트를 생성하는쪽과 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용된다.

팩토리패턴(객체생성부분)

팩토리 클래스의 주 목적은 객체의 생성방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것이다.다른 말로 말하자면 오브젝트를 생성하는 쪽과 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용한다.그럼 DaoFactory는 객체를 생성하는(정하는) 클래스. UserDaoTest는 객체를 사용하는 클래스이다.
public class DaoFactory { public UserDao userDao() { //어떤 디비를 사용 할 것인지 팩토리 클래스에서 정함 ConnectionMaker connectionMaker = new DConnectionMaker(); UserDao userDao = new UserDao(connectionMaker); return userDao; } }
Java
복사

팩토리패턴(객체사용부분)

팩토리사용 클래스 UserDaoTest클래스의 본래의 성격은 UserDao를 test하는 목적의 클래스였다 팩토리 패턴으 도입으로 UserDaoTest는 이제 오브젝트가 어떻게 만들어지는지 신경쓰지않고 팩토리로부터 UserDao오브젝트를 받아다가 사용하면된다
public class UserDaoTest { public static void main(String[] args) throws SQLException, ClassNotFoundException { // new DaoFactory().userDao().add(new User("15","박땡땡","32323")); UserDao userDao = new DaoFactory().userDao(); userDao.deleteById("15"); userDao.getCount(); } }
Java
복사

ConnectionMaker인터페이스

public interface ConnectionMaker { //인터페이스 public Connection makeConnection() throws ClassNotFoundException, SQLException; }
Java
복사

인터페이스를 지정받은 DconnectionMaker클래스

public class DConnectionMaker implements ConnectionMaker { //인터페이스를 지정받은 클래스 @Override public Connection makeConnection() throws ClassNotFoundException, SQLException { Map<String, String> env = System.getenv(); String dbHost = env.get("DB_HOST"); String dbUser = env.get("DB_USER"); String dbPassword = env.get("DB_PASSWORD"); Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection(dbHost, dbUser, dbPassword); return conn; } }
Java
복사

UserDao클래스

public class UserDao { //팩토리 패턴의 주 목적은 userDao의 클라이언트인 userDaoTest에서 구현클래스를 결정하게 하는 것 private ConnectionMaker connectionMaker; public UserDao(ConnectionMaker connectionMaker) { this.connectionMaker = connectionMaker; } public void add(User user) throws SQLException, ClassNotFoundException { Connection conn = connectionMaker.makeConnection(); PreparedStatement ps = conn.prepareStatement("INSERT INTO users(id,name,password) VALUES(?,?,?)"); ps.setString(1, user.getId()); ps.setString(2,user.getName()); ps.setString(3,user.getPassword()); int status = ps.executeUpdate(); System.out.println(status); ps.close(); conn.close(); System.out.println("DB에 등록이 완료되었습니다."); } public User findById(String id) throws ClassNotFoundException, SQLException { Connection conn = connectionMaker.makeConnection(); PreparedStatement ps = conn.prepareStatement("SELECT id,name,password FROM users WHERE id =?"); ps.setString(1,id); // id는 파라미터로 받은 id ResultSet rs = ps.executeQuery(); rs.next(); User user = new User(rs.getString("id"), rs.getString("name"), rs.getString("password")); rs.close(); ps.close(); conn.close(); return user; } public User getAll() throws ClassNotFoundException, SQLException { Map<String, String> env = System.getenv(); String dbHost = env.get("DB_HOST"); String dbUser = env.get("DB_USER"); String dbPassword = env.get("DB_PASSWORD"); Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection(dbHost, dbUser, dbPassword); PreparedStatement ps = conn.prepareStatement("SELECT id,name,password FROM users"); ResultSet rs = ps.executeQuery(); rs.next(); // next는 한번 읽는 것이다. User user = new User(rs.getString("id"), rs.getString("name"), rs.getString("password")); rs.close(); ps.close(); conn.close(); return user; } //id로 delete 해주는 메소드 (매개변수 :id) public void deleteById(String id) throws ClassNotFoundException, SQLException{ Connection conn = connectionMaker.makeConnection(); PreparedStatement ps = conn.prepareStatement("DELETE FROM users WHERE id = ?"); ps.setString(1,id); int status = ps.executeUpdate(); System.out.println(status); ps.close(); conn.close(); System.out.println(id+"번의 USER가 삭제 되었습니다"); } //deleteAll 메소드 (모두 지우는) public void deleteAll() throws ClassNotFoundException, SQLException{ Connection conn = connectionMaker.makeConnection(); PreparedStatement ps = conn.prepareStatement("DELETE FROM users"); int status = ps.executeUpdate(); System.out.println(status); ps.close(); conn.close(); System.out.println("USER 모두가 삭제 되었습니다"); } //getCount 메소드 (user개수) public void getCount() throws ClassNotFoundException, SQLException { Connection conn = connectionMaker.makeConnection(); PreparedStatement ps = conn.prepareStatement("SELECT count(*) as cnt FROM users"); ResultSet rs = ps.executeQuery(); if (rs.next()) { System.out.println("유저수 : "+rs.getInt("cnt")); } rs.close(); ps.close(); conn.close(); } public static void main(String[] args) throws SQLException, ClassNotFoundException { /* User user = new User("13", "인터", "1234"); UserDao u = new UserDao(); u.add(user);*/ } }
Java
복사

DaoFactory(팩토리패턴 → 객체 생성)

public class DaoFactory { /* 팩토리 클래스 팩토리 클래스의 주 목적은 객체의 생성방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것이다. 다른 말로 말하자면 오브젝트를 생성하는 쪽과 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용한다. 그럼 DaoFactory는 객체를 생성하는(정하는) 클래스. UserDaoTest는 객체를 사용하는 클래스이다.*/ public UserDao userDao() { //어떤 디비를 사용 할 것인지 팩토리 클래스에서 정함 ConnectionMaker connectionMaker = new DConnectionMaker(); UserDao userDao = new UserDao(connectionMaker); return userDao; } }
Java
복사

UserDaoTest(팩토리패턴 → 객체 사용)

public class UserDaoTest { /*팩토리사용 클래스 UserDaoTest클래스의 본래의 성격은 UserDao를 test하는 목적의 클래스였다 팩토리 패턴으 도입으로 UserDaoTest는 이제 오브젝트가 어떻게 만들어지는지 신경쓰지않고 팩토리로부터 UserDao오브젝트를 받아다가 사용하면된다*/ public static void main(String[] args) throws SQLException, ClassNotFoundException { // new DaoFactory().userDao().add(new User("15","박땡땡","32323")); UserDao userDao = new DaoFactory().userDao(); userDao.deleteById("15"); userDao.getCount(); } }
Java
복사