본문 바로가기
Spring/토비의 스프링 3.1

토비의 스프링 - 1장 (p.1 ~ 87)

by 성건희 2020. 6. 22.
반응형
무제

학원에서는 스프링 부트로 처음 스프링을 접했는데,
취직을 하고 지금 진행하는 프로젝트에서는 스프링 3.0으로 업무를 보는것이 아닌가..

스프링의 개념을 다잡기 위해서 스프링의 명서인 토비의 스프링을 공부하게 되었다.

 

스프링 삽질의 시작

스프링 부트 와 가장 체감이 되는 부분은 Gradle 설정 부분이었다.

스프링 부트는 spring-boot-starter 를 통해서 연관된 의존성을 자동으로 땡겨올 수 있는데

스프링은 일일히 필요한 의존들을 심어줘야한다는 점이 정말 불편했다.

 

DB는 H2 를 사용했는데, 처음에는 다음과 같이 url 경로를 설정하니까 에러가 발생했다.

jdbc:h2:~/study

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use

 

해결법은 다음과 같이 Server모드로 바꿔주면 된다.

학원을 수강할 때에도 이런식으로 경로를 설정했었는데 그땐 몰랐는데 이런 이유때문이였나 싶다.

jdbc:h2:tcp://localhost/~/study

 

관심사의 분리

맨 처음에는 UserDao를 만들어서 User를 Insert, Select 하는 기능을 만들었는데,

문제는 JDBC 커넥션코드를 매번 작성하고 있었다.

즉, 코드의 중복이 생긴다.

미래를 준비하는 데 있어 가장 중요한 과제는 변화의 폭을 최소한으로 줄이는 것이다.

그래서 커넥션을 연결하는 부분을 getConnection 이라는 별도의 메서드로 분리하여 리팩토링을 할 수 있다.
(메서드 추출 기법 - extract method)

 

상속

중복제거는 좋았는데, 회사 A와 회사 B가 다른 방식으로 커넥션을 한다면?

getConnection 메서드를 추상 메서드로 바꾸고, 이것을 상속하는 쪽에서 구현하도록 하면 될 것 같다.


이처럼 부모 클래스에서 공통된 로직의 흐름 (변하지 않는 부분)을 만들고,
자식마다 달라지는 부분 (자주 변경되는 부분)은 자식 클래스에서 구현하는 방법을 템플릿 메서드 패턴 이라고 한다.

 

상속의 문제점

상속은 사용이 간단하다는 장점이 있지만 문제가 있다.

  • 자바는 다중 상속을 지원하지 않는다. 따라서 다른 목적으로 UserDao에 상속을 적용하기 힘들다.
  • 상속을 통한 부모 - 자식 클래스는 강하게 결합되어 있다. 따라서 변경이 있을 때마다 매번 바꿔줘야 한다.
  • DB 커넥션을 생성하는 코드를 다른 DAO 클래스에 적용할 수 없다.

 

상속보다는 조합

커넥션을 연결하는 부분을 별도의 인터페이스로 분리한다.

public class UserDao {
  private ConnectionMaker connectionMaker;
  
  ...
    
  public void add(User user) {
    Connection c = connectionMaker.makeConnection();
  }
  
  public User get(String id) {
    Connection c = connectionMaker.makeConnection();
  }
}

UserDao에서는 그냥 connectionMaker의 makeConnection() 를 호출만 하면 된다!

 

DI

기존 UserDao 코드는 생성자가 다음과 같았다.

public class UserDao {
  ...
  public UserDao() {
    connectionMaker = new NaverConnectionMaker();
  }
  ...
}

위 코드는 Naver 회사의 커넥션에 강하게 결합 되어있다.

따라서 DI (의존성 주입) 를 통해서 느슨한 결합으로 만들 수 있다.

public class UserDao {
  ...
  public UserDao(ConnectionMaker connectionMaker) {
    this.connectionMaker = connectionMaker;
  }
  ...
}

이를 통해 어떤 회사의 커넥션이 연결되어있든 상관없이 동일하게 처리할 수 있다. (SOLID 의 OCP를 만족)

 

디자인 패턴

책을 보다보면 템플릿 메서드 패턴, 팩토리 메서드 패턴, 전략 패턴 이 나오는데,

이 3가지 패턴이 비슷비슷해서 정확한 차이를 잘 모르겠다.

이 부분은 좀 더 공부를 해봐야 할듯..

 

참고

 

 

반응형

'Spring > 토비의 스프링 3.1' 카테고리의 다른 글

토비의 스프링 chap 4 - 예외  (0) 2022.06.30
토비의 스프링 chap 3 - 템플릿  (2) 2022.06.02
토비의 스프링 3.1 - 2장  (0) 2022.05.30
토비의 스프링 3.1 - 1장  (0) 2022.05.25
1.1 초난감 DAO  (0) 2019.01.06

댓글