1장. 오브젝트와 의존관계

환경 : gradle + spring boot로 실습 (https://github.com/Wu22e/toby_spring)


ㅇㅁㅇ

ㅁㄴㅇㄹ

ㅁㄴㅇㄹ

ㅁㄴㅇㄹㅁㅇ

1234

1234

1234

1234

1234

1234

asdsadasdasd

<div>adsfasdf<div>
const a = 1

스프링 → 자바를 기반으로 한 기술

스프링이 가장 관심을 많이 두는 대상은 오브젝트

오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 "설계"로 발전하게 됨.

그 설계라는 것은 우리가 흔히 말하는 객체지향 설계이며, 이는 디자인 패턴, 리팩토링, 단위 테스트와 같은 여러 응용 기술과 지식이 요구된다.

🏅 1.1 초난감 DAO

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

사용자 정보를 DB로 관리하기 위해 DAO 클래스를 만들어야함.

UserDao 라는 이름의 클래스를 생성하여 사용자 정보의 등록, 수정, 삭제, 각종 조회 기능을 만들 수 있음.

자바에서 DB에 접속할 수 있는 API인 JDBC를 이용한다.

👇 JDBC 작업 순서

  1. DB 연결을 위한 Connection 가져옴
  2. SQL을 담은 Statement(또는 PreparedStatement)를 만듦
  3. 만들어진 Statement 실행
  4. 등록, 수정, 삭제, 조회 기능 수행 (조회의 경우 ResultSet으로 SQL 쿼리 실행결과 받음 → 우리가 사용할 객체에 값을 집어넣어줌)
  5. 작업을 마친후 Connection, Statement, ResultSet과 같은 리소스는 꼭 닫아줘야 함
  6. JDBC API가 만들어 내는 예외를 try catch로 잡거나 throw로 예외를 떠넘겨야 함.

만들어진 코드의 기능을 검증할 가장 간단한 방법 → 오브젝트 스스로 자신을 검증하도록 만들어주는 것

이 말은 모든 클래스에 자신을 엔트리 포인트로 설정해 직접 실행 가능하게 해주는 static 메소드인 main()이 있다는 말이다.

UserDao 코드

public class UserDao {
    public void add(User user) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost/springbook?characterEncoding=UTF-8", "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?characterEncoding=UTF-8", "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;
    }
}

테스트용 main() 메소드

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

        User user = new User();
        user.setId("whiteship");
        user.setName("백기선");
        user.setPassword("married");

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

        User user2 = dao.get(user.getId());
        System.out.println(user2.getName());
        System.out.println(user2.getPassword());

        System.out.println(user2.getId() + " 조회 성공");

    }
}

이렇게 코드 짜면 개발 팀에서 쫓겨날 코드라고함

관심사의 분리가 필요..!

🏅 1.2 DAO의 분리

댓글

Designed by JB FACTORY