[Spring] 스프링이란? 스프링을 이해하기 위한 방법과 실습

스프링이란

스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크다. 애플리케이션 프레임워크는 애플리케이션 개발을 빠르고 효율적

으로 할 수 있도록 애플리케이션의 바탕이 되는 틀과 공통 프로그래밍 모델, 기술 API를 제공해준다.



스프링을 이해하기 위한 방법

스프링은 자바를 기반으로 한 기술이다. 스프링이 자바에서 가장 중요하게 가치르르 두는 것은 바로 객체지향 프로그래밍이 가능한 언어라는 점이다. 스프링이 가장 관심을 많이 두는 대상은 오브젝트다. 스프링을 이해하려면 먼저 오브젝트에 깊은 관심을 가져야 한다. 오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 설계로 발전하게 된다. 객체지향 설계(object oriented design)의 기초와 원칙을 비롯해서, 다양한 목적을 위해 재활용 가능한 설계 방법인 디자인 패턴, 좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업인 리팩토링, 오브젝트가 기대한 대로 동작하고 있는지를 효과적으로 검증하는 데 쓰이는 단위 테스트와 같은 오브젝트 설계와 구현에 관한 여러 가지 응용 기술과 지식이 요구된다. 스프링은 오브젝트를 어떻게 효과적으로 설계하고 구현하고, 사용하고, 이를 개선해나갈 것인가에 대한 명쾌한 기준을 마련해 준다.


자 이제 스프링이 관심을 갖는 대상인 오브젝트의 설계와 구현, 동작원리에 더 집중해보자 그러면 자연스럽게 스프링이 무엇인지도 알 수 있을 것이다.



스프링을 이해하기 위한 실습

사용자 정보를 JDBC API를 통해 DB에 저장하고 조회할 수 있는 간단한 DAO를 하나 만들어 보자.


사용자 정보를 저장할 User클래스를 만든다. 리스트는 id, name, passwrod 세개 의 프로퍼티를 가진 User 클래스다.


package 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;
    }
}
 
cs


이제 MySql을 이용하여 User 오브젝트에 담긴 정보가 실제로 보관될 DB의 테이블을 하나 만들어보자. 


create table users (
    id varchar(10primary key,
    name varchar(20not null,
    password varchar(10not null
)
cs


다음으로  사용자 정보를 DB에 넣고 관리할 수 있는 DAO 클래스를 만들어보자.


package user.dao;
 
public class UserDao {
    public void add(User user) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(jdbc:mysql://localhost/toby_spring""root""asdf");
    
        PreparedStatement ps = con.prepareStatement("insert into users(id, name, password) value(?,?,?)");
        
        ps.setString(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getPassword());
        
        ps.execute();
        
        ps.close();
        con.close();
    }
    
    public User get(String id) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/toby_springe""root""asdf");
 
        PreparedStatement ps = con.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();
        con.close();
        
        return user;
    }
}

cs


add()메소드는 사용자를 추가한 것이고 get()메소드는 사용자 정보를 가져오는 메소드이다. 


DAO의 기능이 올바르게 작동되는지 확인하려면 웹 애플리케이션을 만들어 서버에 배치하고, 웹 브라우저를 통해 DAO기능을 사용하는 것이다 간단한 DAO의 기능을 시험하기 위해서 이러한 짓을 하는건 너무 부담이 크다. 그래서 get() 메소드 밑에 바로 main() 메소드를 만들어 실행해 보자


public static void main(String[] args) throws ClassNotFoundException, SQLException {
        UserDao dao = new UserDao();
        
        User user = new User();
        user.setId("kang3");
        user.setName("현수");
        user.setPassword("1234");
        
        dao.add(user);
        
        System.out.println(user.getId() + "등록 성공");
        
        User user2 = dao.get(user.getId());
        System.out.println(user2.getName());
    }
}
cs


만들어진 코드의 기능을 검증해고자 할 떄 사용할 수 있는 가장 간단한 방법은 오브젝트 스스로 자신을 검증하도록 만들어 주는 것이다. 실행 결과 정상적으로 작동 되는것을 확인 하였다.

이렇게 해서 사용자 정보의 등록과 조회가 되는 초간단 DAO와 테스트용 메소드까지 완성했다. 하지만 실제 프로젝트에서 자바 개발자가 이렇게 DAO를 개발했다면 뺨맞고 퇴출 당할수도 있다.

이제부터 이 DAO코드를 객체지향 기술의 원리에 충실한 스프링 스타일의 코드로 개선해보도록 해보자.


스프링을 시작하기에 앞서
스프링은 기계적인 답변이나 성급한 결론을 주지 않는다. 최종 견론은 스프링을 이용해 개발자가 스스로 만들어 내는 것이다. 그러기 위해선 우리는 계속 밑에 있는 항목들을 고민해봐야 한다.

1. 왜 이 코드에 문제가 많다고 하는 것일까?
2. 잘 동작 하는 코드를 굳이 수정하고 개선해야 하는 이유는 뭘까?
3. 그렇게 DAO 코드를 개선했을 때의 장점은 무엇일까? 그런 장점들이 현재와 미래에 주는 유익은 무엇일까?
4. 또, 객체지향 설계의 원칙과는 무슨 상관이 있을까?
5. 이 DAO를 개선하는 경우와 그대로 사용하는 경우, 스플링을 사용하는 개발에서 무슨 차이가 있을까?

이러한 고민으로 좋은 결론을 내릴 수 있도록 해보자!


이일민, 토비의 스프링 3, 에이콘


댓글

Designed by JB FACTORY