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

1.1 초난감 DAO

by 성건희 2019. 1. 6.
반응형

# 서론

코드스쿼드 레벨 3 과정을 진행하면서 스프링의 무수한 개념들이 물밀듯이 들이닥쳐서 초기에는 사용법에 급급하며 이론보다는 동작을 하는데에만 초점을 맞추다 보니 시간이 흐름에 따라 '내가 정말 개념이 정말 부족하구나'를 느끼고 충격을 받아서 포비(자바지기)가 추천해주신 너무나도 유명한 책 "토비의 스프링3.1" 을 일단은 6장 AOP 까지 파헤쳐 볼 생각이다. 험난한 여정이 되겠지만 더욱 발전할 나를 위해 여행을 떠나보자!


"토비의 스프링 3번 정독하면 네이버 가실 수 있어요". - feat. 네이버 입사하신 전 전 기수 '브라이언'

 

# 1.1 초난감 DAO

먼저 사용자 정보를 저장할 User 클래스를 만들어 보자.

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

 

그 다음 실제 저장할 DB 테이블을 만들어 보자.

여기서는 h2를 기반으로 실습한다. (설치방법은 구글링을 통해서 쉽게 따라 설치할 수 있으니 생략한다.)

h2.console 프로그램을 실행하면 다음과 같은 창이 열린다.


위 내용을 그대로 입력한 뒤 연결을 누른다.

SQL 창으로 들어오면 실제 User 데이터를 저장할 테이블을 작성해준다.


그런 뒤 왼쪽 상단을 보면 USERS 테이블이 생긴것을 볼 수 있다.


 

그 후 사용자 정보를 BD에 넣고 관리할 수 있는 UserDao 클래스를 만든다.

DAO

Data Access Object 의 약어로, DB를 사용해서 데이터를 조회, 조작하는 기능을 전담하는 오브젝트

public class UserDao {
    public void add(User user) throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:h2:tcp://localhost/~/springbook", "sa", "");

        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("org.h2.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:h2:tcp://localhost/~/springbook", "sa", "");

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

 

이 부분에서 상당한 삽질을 많이 했는데, 원래는 DB를 스프링 부트 프로젝트에서 그래들과 설정파일에 추가하면 자동으로 연결되서 바로 사용가능 했었는데, 이렇게 수동으로 일일히 연결해본 경험이 없다보니 시간을 많이 잡아먹었다..

교재에는 "com.mysql.jdbc.Driver" 를 사용했지만,

현재 학원에서 진행중인 java-ims 프로젝트도 h2를 사용하기 때문에 h2를 사용해 보았다.

Class.forName("org.h2.Driver");

를 사용하려면 우선 클래스 파일을 추가해 주는 작업을 해야지만 사용이 가능하다.

본 실습은 '인텔리제이' 를 기반으로 진행한다.

 

# 클래스 파일 추가하기

File - Project Structure 에 들어간다.


Project Settings - Libraries 탭을 클릭한다.


상단 + 부분을 클릭 후 Java 를 선택한다.


h2 폴더의 위치를 찾아 확인 버튼을 눌러준다.

(h2 폴더의 위치는 "D:Program Files (x86) / H2 / bin / h2-1.4.197.jar" 이다.)

그 후 사진과 같이 main 을 클릭하고 OK 버튼을 누른다.


등록이 완료되면 아래 처럼 h2-1.4.197 이 등록이 된다.


Apply 클릭 후 OK를 눌러준다.

 

# Main() 작성 후 DAO 테스트

앞서 만들었던 User 객체가 DB에 잘 저장되는지 테스트를 해보자.

Main 클래스를 만들어 보자.

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        UserDao dao = new UserDao();

        User user = new User();
        user.setId("lime");
        user.setName("라임");
        user.setPassword("123");

        dao.add(user);

        System.out.println(user.getId() + "등록 성공");

        User user2 = dao.get(user.getId());
        System.out.println(user2.getId() + "조회 성공");
        System.out.println(user2.getName());
        System.out.println(user2.getPassword());

    }
}

그 후 Main 메서드를 실행 해 보면 어떻게 될까?


일단은 에러없이 성공적으로 작동한 듯 하다.

그럼 잘 들어갔는지 h2 콘솔에서 확인해 보자.


정상적으로 User 데이터가 DB에 반영된 것을 볼 수 있다.

 

주의 )

id 가 기본키로 설정 되어 있기 때문에, Main 메서드를 2번이상 실행하게 되면 id 중복 생성으로 에러가 나게 된다.

때문에, DB에 저장되어있는 쿼리를 지우고 다시 실행시켜야 한다.

 

# 정리

힘들게 DAO를 만들어보는 시간을 가졌는데, 열심히 따라 만들어본 여러분들에게 박수를 보낸다. (따라했으리라 믿는다.)

아쉽지만 위 코드는 정상적으로 동작은 하지만, 유지보수와 수정에 있어서 리팩토링도 전혀 안되어있는 냄새나는 코드. 

말그대로 초난감한 DAO다.

다음 챕터에서는 이 냄새나는 코드를 객체지향 적인 아름다운 코드로 발전시켜보는 시간을 가져보자!

 

# 참고

H2base JDBC 연동


반응형

댓글