본문 바로가기

Spring/Benepicture 홈페이지

[베네픽처 홈페이지] JDBC Template 적용 (JDBC, SQL Mapper, ORM)

예전 Nodejs로 홈페이지를 만들 때는 MongoDB를 위한 ODM(Object Data Mapping) library를 사용하였습니다.

Java 기반의 Hibernate. iBatis 등의 ORM(Object Relational Mapping)과 유사한 개념이라고 생각하면 편합니다.

 

이제 스프링으로 홈페이지를 새로 만들면서 바로 Mybatis를 적용해볼까 하다가 JDBC Template를 먼저 사용해보고 적용하는 것이 공부하는데도 도움이 될 것이라 생각하여 먼저 적용하게 되었습니다.

 

JDBC 란

자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API로 크게 3가지를 정의해서 "인터페이스"로 정의해서 제공하여 다양한 데이터베이스들을 표준화 해주는 인터페이스입니다.

 

- Conneciton : 연결

- Statement : SQL을 담은 내용

- ResultSet : SQL 요청 응답

 

하지만 결국 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 DB마다 다른 SQL문은 변경을 하여야 합니다.

 

 

그렇게 해서 나온 개념이

 

SQL Mapper란

JDBC를 편리하게 사용하도록 도와주도록 나왔습니다.

 

애플리케이션 로직 (SQL 전달) >> JDBC 

이러한 형태에서

 

애플리케이션 로직 (SQL 전달) >>  SQL Mapper (SQL 전달)>> JDBC

이러한 식으로 중간에서

- SQL 응답 결과를 객체로 변환해주고

- JDBC의 반복 코드를 제거해주는 등

편리하게 사용할 수 있도록 도와주는 데이터 접근 기술입니다.

(개발자가 직접 SQL을 작성하여야 합니다.)

 

즉, 쉽게 설명하면 SQL Mapper는 SQL만 직접 작성하면 나머지 번거로운 일들(커넥션 연결,SQL 요청 응답, 객체 변환, 예외 처리 등..)은 SQL Mapper가 대신 해결해줍니다.

 

대표적인 기술은 스프링의 JdbcTemplate, MyBatis가 있습니다.

 

** 참고 : ORM 기술이란

SQL Mapper와 비교과 되는 기술이 또 있습니다.

그것은 ORM(Object Relational Mapping)기술로

주요 핵심은 객체를 관계형 데이터베이스 테이블에 매핑해주는 기술입니다. 즉 ORM 기술이 개발자 대신에 SQL을 동적으로 만들어서 실행시켜 줍니다. (개발자가 직접 SQL을 작성할 일이 없습니다.) 하지만 그만큼 편리하고 많이 사용되는 기술이지만 학습이 많이.. 필요하다고 합니다.

 

대표적인 기술은 JPA(인터페이스)로 JPA를 구현한 것으로 하이버네이트, 이클립스 링크가 있습니다.

 

 

우선 이 기술들 중에서 저는 SQL Mapper인 JdbcTemplate를 적용해보려 합니다.

기존 Jdbc를 사용하는 것에서 JdbcTemplate를 사용하므로써 얻는 이점들은

1. Service를 순수한 비즈니스 로직만 남길 수 있습니다. 

객체지향 프로그래밍의 기술의 발전은 표준화와 추상화의 연속이라고 생각합니다.

Service객체가 비즈니스로직만 남기게 되면 Repository가 변경되더라도 Service객체는 변경할 필요가 없어집니다.

그 이유는 예외처리가 기본적으로 Check 예외가 전달되어서 Repository의 예외가 Service를 거쳐 서블릿으로 가게 되는데 이 예외를 런타임 예외로 변환해주어 Repository에 의존적이지 않은 Service를 만들어주게 됩니다.

(이 내용만으로도 많은 이야기가 필요하므로 자세한 내용은 다시 정리하겠습니다.)

 

이렇게 최대한 결합도는 낮추고 응집도를 높히는 일이 좋은 설계 방법이라고 생각합니다.

적용

우선 커넥션할 DB 정보를 properties에 위와 같이 저장하면 (실무에서는 하드코딩은 절대.. 안됩니다.)

이 값을 DataSource의 속성으로 설정한 후 BasicDataSource를 bean으로 등록합니다.

Spring JDBC를 사용하려면 먼저, DB Connection을 가져오는 DataSource를 Spring IoC 컨테이너의 공유 가능한 Bean으로 등록해야 한다.
생성된 BasicDataSource Bean을 Spring JDBC에 주입한다.

 

UserRepository

public class UserRepository implements UserRepositoryInterface {

    private final JdbcTemplate template;

    public UserRepository(DataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }


    @Override
    public User save(User user) {
        String sql = "insert into user(user_id, user_password) values (?, ?)";
        template.update(sql, user.getUserId(), user.getUserPassword());
        return user;
    }

    @Override
    public User findById(String userId) {
        String sql = "select * from user where user_id = ?";
        return template.queryForObject(sql, userRowMapper(), userId);
    }

    public User login(String userId, String userPW){
        String sql = "select * from user where user_id = ? and user_password = ?";
        return template.queryForObject(sql, userRowMapper(), userId,userPW);
    }

    private RowMapper<User> userRowMapper() {
        return (rs, rowNum) -> {
            User user = new User();
            user.setUserId(rs.getString("user_id"));
            user.setUserPassword(rs.getString("user_password"));
            return user;
        };
    }
}

Repository에서 생성자로 아까 생성된 DataSource Bean을 블러와서 JdbcTemplate와 연결해준다.

 

그 후 sql문을 입력하고 update, queryForObject 등 필요에 따라 사용하면 됩니다.

 

update와 queryForObject의 파라미터들을 설명하면

update  ( sql문 , ?로 비워놓은 sql문에 대입할 값을 순서대로)

queryForObject (sql문, 반환할 객체의 타입, ?로 비워놓은 sql문에 대입할 값을 순서대로)

입니다.

 

 

 

 

참고 : 

https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html