본문 바로가기

스프링

1장 오브젝트와 의존관계

토비의 스프링 3.1을 읽으며 정리를 해보려한다.

 

스프링은 자바를 기반으로 한 기술이며 스프링이 자바에서 가장 중요하게 가치를 두는 것은 바로 객체지향프로그래밍이 가능한 언어라는 점이다. 

스프링에서 가장 관심을 두는 대상은 오브젝트이다. 

토비의 스프링 1장에서는 스프링에 대한 것보다도 스프링이 관심을 갖는 대상인 오브젝트의 설계, 구현, 동작원리에 대해 더 자세히 나와있다.

 

초난감 DAO

DAO
Data Access Object의 줄임말로 DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.
자바빈
다음과 같은 두 가지 관례를 따라 만들어진 오브젝트를 말한다. 간단히 빈이라고 부르기도 한다.

디폴트 생성자 : 자바빈은 파라미터가 없는 디폴트 생성자를 갖고 있어야 한다. 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하기 때문에 필요하다.

프로퍼티 : 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다. 프로퍼티는 setter와 getter를 이용해 수정 또는 조회할 수 있다

1. UserDao

public class UserDao {
public void add(User user) throws ClassNotFoundException, SQLException {
   Class.forName("org.h2.Driver");
   Connection c = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");   
   PreparedStatement ps = c.prepareStatement("insert into users(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("org.h2.Driver");
   Connection c = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");

   PreparedStatement ps = c.prepareStatement("select * from users 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;
 }
}

위의 코드는 간단하며 정상동작을 하지만 난감한 문제를 가지고있다.

그 문제를 어떻게 해결할 것인가를 밑에서 다양한 과정을 소개한다.

DAO의 분리

관심사의 분리

프로그래밍의 기초 개념 중에 관심사의 분리가 있다.  

관심이 같은 것끼리 하나의 객체나 친한 객체로 모아 관심이 다른 것은 서로 떨어뜨려 영향을 주지 않도록 분리하는 것

 

UserDao의 관심사항 정의

  • DB와 연결을 위한 커넥션에 대한 관심
  • DB에 보낼 SQL 문장을 담은 Stetement 만들고 실행에 대한 관심
  • 작업 종료 후 공유 리소스를 시스템에 반환에 대한 관심 

1. 중복코드의 메소드 추출

가장 먼저 중복코드를 분리하는 것이다.

UserDao클래스의 add(), get() 메소드에는 DB연결을 위한 Connection 오브젝트를 가져오는 코드가 중복되어있다.

UserDao클래스가 아직은 두개의 메소드밖에 없지만 점점 커질지도 모르는 상태에서 DB커넥션을 가져오는 코드가 여기저기 계속 중복된다면 변경해야할 때마다 힘들게 될 것이다.

public void add(User user) throws ClassNotFoundException, SQLException {
	Connection c = getConnection();
    ...
}

public void get(User user) throws ClassNotFoundException, SQLException {
	Connection c = getConnection();
    ...
}

private Connection getConnection() throws ClassNotFoundException, SQLException {
   Class.forName("org.h2.Driver");
   Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");   
return c;
}

위와 같이 수정한다면 DB연결 관련부분이 수정된다하더라도 getConnection()메소드만 수정하면된다.

 

2. 변경사항에 대한 검증: 리팩토링과 테스트

'스프링' 카테고리의 다른 글

Spring Bean  (0) 2022.02.20
[SpringBoot] PasswordEncoder 적용하기  (0) 2022.02.18
스프링 삼각형과 설정 정보 - AOP / PSA  (0) 2022.02.09
의존성주입 DI(Dependency InJection)의 종류  (0) 2022.02.09
스프링  (0) 2022.02.09