Spring

DAO작성& 관심사 분리 & 커넥션 추출 & mysql 연동

코리늬 2018. 8. 1. 16:39

- DAO

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


1.1.1 User

사용자 정보를 저장할 때는 자바빈 규약을 따르는 오브젝트를 이용하면 편리하다.


create table users (

id varchar(10) primary key,

    name varchar(20) not null,

    password varchar(10) not null

    )

user 테이블은 위와 같이 구성했다.


1.1.2 UserDao

사용자 정보를 DB에 넣고 관리할 수 있는 DAO 클래스

위와 같이 코드를 작성하고 실행했더니 DB에 값이 들어간 것을 볼 수 있다.

* 하지만 위와 같이 DAO를 작성했다면 매우 초보적인 수준이라고 한다. 


1.2 DAO의 분리

1.2.1 관심사의 분리

프로그래밍 기초 개념 중 관심사의 분리라는 것이 있다. 관심이 같은 것 끼리 하나의 객체로 모으고, 다른 것은 따로 떨어져 서로 영향

을 주지 않도록 분리하는 것이다.


1.2.2 커넥션 만들기의 추출

위의 UserDao를 파헤쳐보면 적어도 세 가지의 관심사항을 볼 수 있다.

    • DB와 연결을 위한 커넥션을 어떻게 가져올지, 어떤 DB, 어떤 드라이버를 사용할지, 어떤 로그인 정보를 사용할지
    • 사용자 등록을 위해 DB에 보낼 SQL 문장을 담을 Statement를 만들고 실행하는 것, 여기서의 관심은 파라미터로 넘어온 사용자 정보를 Statement에 바인딩시키고 Statement에 담긴 SQL을 DB를 통해 실행시키는 방법이다. 
    • 작업이 끝나면 사용한 리소스인 Statement와 Connection 오브젝트를 닫아줘 소중한 공유 리소스를 시스템에 돌려주는 것.

- 바인딩 : 함수를 호출하는 부분에서 함수가 위치한 메모리 번지를 연결시켜 주는 것

위에서 작성한 Dao 클래스가 초보적인 수준인 이유는 예외상황에 대한 처리가 전혀없기 때문이다.

1. 수많은 동시 사용자가 있고

2. 한번 시작되면 장기간 운용되는 서버에 올라갈 때 예외상황에 적절하게 대응해 공유 리소스를 반환하지 않는 일이 없도록 주의해야한다.


* add() 메소드와 get() 메소드에 DB 커넥션을 가져오는 코드가 중복되어 있다.

아직은 2개의 메소드 뿐이지만 수백, 수천 개의 DAO 메소드를 만들게 된다면 이러한 관심사들의 중복이 엄청난 고통을일으키는 원인이 된다.


- 중복 메소드 추출

위와 같이 getConnection이라는 독립적인 메소드를 만들어 getConnection 메소드를 호출해 DB커넥션을 가져오게 만든다.

그 결과 DB 종류와 접속 방법이 바뀌어 드라이버 클래스와 URL이 바뀌었다거나, 로그인 정보가 변경돼도 getConnection()메소드의 

코드만 수정하면 된다.


위처럼 기능이 추가되거나 바뀐 것은 없지만 UserDao는 좀더 깔끔해지고 미래의 변화에 대응하기 쉬운 코드가 되었다.

이러한 작업을 리팩토링이라고 한다.

또한 메소드의 중복된 코드를 뽑아낸 것을 리팩토링에서는 메소드 추출 기법이라고 부른다.

- 리팩토링 : 기존의 코드를 외부의 동작방식에서는 변화 없이 내부 구조를 변경해 재구성하는 작업 또는 기술. 

코드 내부의 설계가 개선되어 코드 이해하기가 쉬워지고 변화에 효율적으로 대응이가능하다. 생산성은 올라가고, 

코드의 품질또한 높아지며, 유지보수하기 용이하고, 견고하고 유연한 제품을 개발할 수 있다.


1.2.3 DB커넥션 만들기의 독립

만약에 UserDao가 다른 곳에 납품을 하여 UserDao를 제공하지 않고 고객 스스로 원하는 DB 커넥션 생성방식을 적용해가면서

UserDao를 사용하게 할 수 있는지? 

이럴 때 상속을 통한 확장을 하게 된다.

- 상속을 통한 확장

getConnection 메소드를 추상메소드로 만든다. 추상 메소드이기 때문에 코드는 그대로 유지하면서 고객 스스로 필요한 기능을 

UserDao 클래스를 상속해 서브클래스를 만들면 getConnection() 메소드만 원하는 방식으로 확장해 사용할 수 있다.


- 상속을 통한 확장 방법이 제공되는 UserDao

이제 UserDao는 수정할 필요 없이 DB 연결 기능을 정의한 클래스를 만들 수 있다.

이렇게 슈퍼 클래스에 기본적인 로직의 흐름을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으

로 만든 뒤 서브 클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법을 디자인 패턴에서 템플릿 메소드  패턴이라

고 한다. 스프링에서 애용되는 디자인 패턴이다.

이렇게 서브클래스에서 구체적인 오브젝트 생성 방법을 팩토리 메소드 패턴이라고 부르기도 한다.


하지만 상속을 사용했다는 단점도 있다.

자바는 클래스의 다중상속을 허용하지 않기 때문에 UserDao가 다른 목적을 위해 상속을 사용하고 있다면 문제가 발생한다.

또한 상하위 클래스의 관계 때문에 슈퍼클래스 내부의 변경이 있을 때 모든 서브클래스를 함께 수정해야 할 수도 있다.

반대로 슈퍼클래스가 더 이상 변화하지 않도록 제약을 가해야 할 수도 있다.

또한 UserDao 이외의 DAO클래스가 계속 만들어지면 상속을 통해서 만들어진 getConnection() 코드가 매 DAO클래스마다 중복돼서

심각한 문제가 발생할 수 있다.


이를 해결하기 위해 DAO의 확장이 필요하다.