More actions
초난감 DAO
- 사용자 정보를 JDBC API를 이용해 DB에 저장하고 조회할 수 있는 간단한 DAO 만들기.
- DAO(Data Access Object)
- DB를 사용하여 데이터를 조회, 조작하는 기능을 전담하도록 만든 오브젝트.
User
- 사용자 정보를 저장할 때 자바빈 규약을 따르는 오브젝트를 이용하면 편리하다.
- 자바빈(JavaBean)
- 간단히 빈이라고도 한다.
- 원래 의미는 비주얼 툴에서 조작 가능한 컴포넌트.
- 요즘은
- 파라미터가 없는 디폴트 생성자를 가지고 있고
- getter와 setter를 통해 조회, 수정할 수 있는 프로퍼티를 가진 오브젝트를 의미한다.
- User : 사용자 정보 저장용 자바빈 클래스
package springbook.user.domain;
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;
}
}
- USER 테이블
| 필드명 | 타입 | 설정 |
| UserId | VARCHAR(10) | Primary Key |
| Name | VARCHAR(20) | Not Null |
| Password | VARCHAR(20) | Not Null |
UserDao
- UserDao : JDBC를 이용한 등록, 조회 기능이 있는 DAO 클래스
package springbook.user.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import springbook.user.domain.User;
public class UserDao {
public void add(User user) throws SQLException, ClassNotFoundException{
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
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("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook", "spring", "book");
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;
}
}
Test Code
DAO의 분리
DAO의 확장
- 관심사에 따라 오브젝트 나누기
- 관심사가 다르다
- 변화의 성격이 다르다
- 변화의 성격이 다르다는 것은 변화의 이유와 시기, 주기가 다르다는 것을 의미함
- 추상클래스를 만들어놓고 상속을 통해 변화를 구현하는 방법 -> 불편하다
- 1.3.1 클래스의 분리
- 서로 다른 관심사를 독립적인 클래스로 분리해보자
- 기존의 코드를 수정할 때는 기능의 변화가 아닌 내부 설계를 변경해 더 나은 코드를 만드는 것 이다(리팩토링)
- 리팩토링 후 기능의 변화가 없는지 검증해야 한다. 테스트 코드가 이를 검증해 준다.
- 분리된 두 클래스는 의존관계를 가진다.
- 1.3.2 인터페이스의 도입
- 클래스 분리에서 가장 중요한 점은 두 클래스가 낮은 결합도를 가져야 한다는 것이다.
- 추상화
- 어떤 것들의 공통적인 성격을 뽑아내어 이를 따로 분리해내는 작업
- interface
- 1.3.3 관계설정 책임의 분리
- 코드의 크기가 작고 간단해도 클래스와는 다른 독립적인 관심사를 가지고 있다면 분리해야한다.
- 클래스의 확장성을 해칠 수 있다.
- 클래스간의 관계설정
- 오브젝트와 오브젝트간의 관계설정을 의미한다.
- 오브젝트 사이의 관계란 런타임시에 한 오브젝트가 다른 오브젝트의 레퍼런스를 가지고 방식이다.
- 방법
- 사용할 오브젝트를 내부에서 생성
- 파라메터를 이용해 외부에서 전달받는다. 이때 파라메터는 인터페이스를 이용한다.
- 1.3.4 윈칙과 패턴
- 개방 폐쇄 원칙
- 높은 응집도와 낮은 결합도
- 전략 패턴
제어의 역전(IoC)
스프링의 IoC
5.1 오브젝트 팩토리를 이용한 스프링 IoC
5.1.1 빈(bean) : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트. 자바빈에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트. 빈 팩토리(bean factory) : 빈의 생성과 관계설정 등의 제어를 담당하는 IoC오브젝트. 애플리케이션 컨텍스트(application context) : IoC방식을 따라 만들어진 일종의 빈팩토리. 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다. 설정 정보를 따로 받아와서 이를 활용하는 IoC엔진이라고 볼 수 있다.
싱글톤 레지스트리와 오브젝트 스코프
의존관계 주입(DI)
- 의존관계 : 두 클래스 또는 모듈이 있을 때 한 쪽의 변화가 다른 쪽에 영향을 미치는 상황.
- 의존관계 주입(DI)? : 의존관계 주입(Dependency Injection)이란 스프링에 사용된 제어의 역전(IoC) 방식을 조금 더 명확하게 나타내기 위해서 사용한 용어이다.
- 의존관계 주입의 세 가지 조건
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.
- DI의 장점 : DI를 받았을 경우 주입된 오브젝트를 인터페이스로 받는데 이렇게 하면 코드에 런타임 클래스와의 관계가 직접 드러나지 않기 때문에 주입시 주입하는 오브젝트를 바꿔주는 것으로 코드의 변경, 확장에 쉽게 대응할 수 있다.
- 스프링에서의 DI
- Bean : 스프링에서는 DI를 쉽게 하기 위해서 Bean을 이용하여 오브젝트를 관리한다.
- Bean Factory : 런타임 시점에서 의존관계를 결정하기 위해 Bean Factory에서 Bean을 관리하고 오브젝트간의 관계를 맺어준다.
- 의존관계 검색(Dependency Lookup) : 스프링의 DI방식을 이용하기 위해서는 DI를 받는 오브젝트가 반드시 Bean이어야 한다. 하지만 DL을 이용하면 Bean이 아닌 오브젝트에서도 의존관계를 설정할 수 있다.
XML을 이용한 설정
- 스프링에서는 DI의존관계를 만들 때 직접적으로 코드를 수정하는 것 외에도 다양한 방식을 제공하고 있다. XML은 단순한 텍스트 파일이기 때문에 다루기 쉽고 추가적인 빌드작업이 필요하지 않다.
- <bean> : @Bean이 붙은 자바 메소드에 대응한다.
- <id>
- <property>
- <ref>