Spring Framework

추상화 앞서 인터페이스에 의존하고 런타임에 구체 클래스를 주입하여 의존 관계를 설정하는 방법을 살펴보았다. 이렇게 구체 클래스가 아닌 인터페이스에 의존하면 인터페이스에서 정의한 메소드를 통한 일관된 사용방법을 가지게 된다. 일반적으로는 인터페이스를 먼저 정의하기보다 비슷한 역할을 수행하는 여러 클래스에서 중복된 부분을 추출하는 과정에서 인터페이스를 정의하게 되는데, 이것을 '추상화'한다라고 표현한다. 데이터베이스 연결이나 트랜잭션 관리 등 좀 더 넓은 개념에서도 정확히 같은 방식으로 추상화할 수 있다. 생각해보면 MySQL이나 Oracle, PostgreSQL 등의 DB 종류와 상관없이 사용 방법은 비슷하다. 커넥션을 만든 다음, SQL을 작성하여 DB에 쿼리하고, 결과를 받아서 오브젝트에 매핑한다. 트..
클래스 분리 먼저 전략패턴을 이용한 클래스 분리를 되돌아보자. 전략패턴과 DI로 다양한 기능을 구현하면 위의 그림과 같은 모양이 된다. 왼쪽의 세 클래스는 공통으로 보라색 로직을 가지고 있기 때문에 보라색 부분을 클래스로 분리하면 한 곳에서 관리할 수 있다. 클라이언트는 스프링이 DI해준 왼쪽과 같은 상태의 인스턴스를 사용하기만 하면 된다. 그렇다면 위와 같이 중간의 로직이 다르고 위, 아래가 반복되는 경우는 어떻게 클래스를 나누어서 관리할 수 있을까? 이번에는 파란색 부분을 분리해봤다. 왼쪽처럼 분리한다면 가운데 로직들은 어떻게 사용할까? 클라이언트가 호출할 수 있는 부분은 파란색이고, 다른 색깔은 알 수 없다. 오른쪽처럼 전략패턴을 사용한다면 원하던 로직을 만들 수 없다. 이런 경우의 대표적인 예시가..
의존성 주입(DI) 이전 글에서 구체 클래스가 아닌 인터페이스에만 의존하기 위해 인스턴스를 외부에서 생성하고, 주입받도록 만들었다. 이렇게 클래스의 의존 관계를 외부에서 주입해주는 것을 의존성 주입(Dependency Injection)이라고 한다. public class UserRepository { private ConnectionMaker cm; public UserRepository(ConnectionMaker cm) { this.cm = cm; } public List getAllUsers() { /* ~~ 생략 ~~ */ Connection c = cm.getConnection(); PreparedStatement ps = c.prepareStatement("select * from user"..
중복 제거 전체적인 설계가 없는 상태에서 코드를 작성하다보면 중복된 코드가 나타나는 경우가 많다. 이렇게 중복된 코드는 대부분 하나가 수정되면 다른 곳도 수정이 되어야 한다. 따라서 중복된 코드를 한 곳에서 관리해주지 않으면 관리 포인트가 늘어나게 된다. public class UserRepository { public List getAllUsers() { /* ~~ 생략 ~~ */ Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/user", "username", "pwd"); PreparedStatement ps = c.prepareStatement("select * from user"); /* ~~ 생략 ~~ */ } p..
ready-go
'Spring Framework' 카테고리의 글 목록