Spring/스프링의 이해와 원리

오브젝트와 의존관계 - 1. 스프링의 기본, 오브젝트 이해하기

JWonK 2022. 3. 9. 17:47
728x90
반응형

스프링은 자바를 기반으로 한 기술로 스프링이 자바에서 가장 중요하게 두는 것은 객체 지향 설계이다.

따라서, 스프링을 바르게 이해하기 위해서는 가장 먼저 오브젝트에 대한 기본적인 이해가 필요하다.

애플리케이션에서 오브젝트가 생성되고 다른 오브젝트와 관계를 맺고, 사용되고, 소멸되는 전 과정을 바르게 이해해야한다.

 

따라서, 이 글에서는 스프링에 대한 글이 아닌 오브젝트의 설계와 구현에 대해 살펴본다.

 


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

DAO(Data Access Object) : DB를 사용해 데이트럴 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

 

사용자의 정보(id, name, password)를 가진 User 클래스를 만들어보자. 

롬복을 사용하여 Setter와 Getter 코드를 간소화하였다.

package jpaEx.toyP.tobispring;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class User {

    public String id;
    public String name;
    public String password;
}

 

DB를 생성한 후에는 CREATE TABLE 명령을 실행하여 테이블을 만들어준다.

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

 

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

사용자 정보의 등록, 수정, 삭제와 각종 조회 기능을 만들어야겠지만, 일단 새로운 사용자를 생성하고(add), 사용자 정보를 읽어오는(get) 두 개의 메소드를 만들어본다.

 

 

JDBC를 이용하는 작업의 일반적인 순서는 다음과 같다

1. DB 연결을 위한 Connection을 가져온다.

2. SQL을 담은 Statement(또는 PreparedStatement)를 만든다.

3. 만들어진 Statement를 실행한다.

4. 조희의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트에 옮겨준다.

5. 작업 중에 생성된 Connection, statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아준다.

6. JDBC API가 만들어내는 예외(exception)를 잡아서 직접 처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 메소드 밖으로 던진다.

 

 

 

 

< JDBC API의 기본적인 사용 방법을 따라서 만든 UserDao 클래스 >

package jpaEx.toyP.tobispring;

import javax.xml.transform.Result;
import java.sql.*;

public class UserDao1 {

    public void add(User user) throws ClassNotFoundException, SQLException{
        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;
    }
}

 

 

위 코드를 보고 무엇이 문제인지 바로 알아야한다. 테스트 코드를 작성해서 확인해보면 결과적으로 문제는 발생하지 않지만 이 코드는 절대 좋은 코드가 아니다. 

 

자바 언어의 특성인 객체 지향 프로그래밍 적용이 하나도 되지 않은 최악의 코드이다. 이 코드를 수정해본다.

728x90
반응형