새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

2 분 소요

오브젝트와 의존관계

1.1 초난감 DAO

부제. 스프링을 학습하는 이유

자바는 객체지향 프로그래밍(OOP) 언어이며, 스프링은 이를 기반으로 만들어진 프레임워크다.

스프링은 개발자가 객체지향적인 코드를 작성할 수 있도록 다양한 기능을 제공하며,

객체지향 원칙과 설계를 반영해 객체의 생성, 협력, 소멸을 올바르게 관리할 수 있도록 설계되었다.

스프링 개발자는 단순히 스프링이 제공하는 기능을 사용하는 것뿐만 아니라,

스프링이 객체(오브젝트)를 어떻게 관리하는지 이해하면서 객체지향 프로그래밍의 철학을 배울 필요가 있다.

스프링의 철학과 설계를 학습하다 보면,스프링이 지향하는 객체지향 프로그래밍의 원리를 자연스럽게 익힐 수 있고, 결과적으로 더 효율적이고 유지보수하기 쉬운 객체지향 코드를 작성할 수 있게 된다.

처음 개발을 배울때 클론 코딩을 하는 이유는 잘 작성된 코드를 보면서 빠르게 습득할 수 있기 때문이라고 생각합니다.

1장에서는 개발자가 스프링의 철학과 스프링이 오브젝트를 어떻게 관리하고 설계하는지 코드로 보면서 객체지향 프로그래밍으로 작성할 수 있는 기초 지식을 준비할 수 있다고 말하는 거같습니다.

문제 코드

public class UserDao {

	public void add(final User user) throws ClassNotFoundException, SQLException {
		System.out.println("User added: " + user.getId());
		Class.forName("com.mysql.cj.jdbc.Driver");

		final Connection con = DriverManager.getConnection("jdbc:mysql://localhost/spring", "root", "1234");
		final PreparedStatement ps = con.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();
		con.close();
	}

	// get users info by id
	// create
	public User get(final String id) throws SQLException, ClassNotFoundException {
		Class.forName("com.mysql.cj.jdbc.Driver");
		final Connection con = DriverManager.getConnection("jdbc:mysql://localhost/spring", "root", "1234");

		// find
		final PreparedStatement ps = con.prepareStatement("select * from users where id = ?;");
		ps.setString(1, id);

		final ResultSet rs = ps.executeQuery();
		rs.next();
		final 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;

	}

	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		UserDao userDao = new UserDao();
		User user = new User();
		user.setId("sungnam1");
		user.setName("Sungnam");
		user.setPassword("password");
		userDao.add(user);

		final User user1 = userDao.get("sungnam1");
		System.out.println(user1);
	}
}

답안지를 작성하기 전의 문제점 찾기

  1. 회원을 저장하거나 추가하는 요청이 많아질 경우 서버와 데이터베이스 커넥션이 비례해서 증가한다.
  2. 데이터베이스에서 조회와 저장시 매번 새 커넥션 연결 과정이 생긴다.
  3. 데이터베이스 연결에 필요한 정보가 메서드 내에 있어서 변경하려면 모든 소스 코드를 변경해야한다.
  4. 클라이언트가 데이터베이스 연결에 필요한 객체를 의존하는 책임이 있다.
  5. 저장이나 조회 도중 오류가 발생하는 경우 close가 처리되지 않고 리소스가 반납되지 않는다.

문제점을 찾기 전에 생각해야할 일

  1. 해당 코드는 문제 없이 동작하는지 개발자의 눈으로 확인하였다.
  2. 실행할 때 문제없이 동작했는데 문제라고 생각한 이유를 정의할 줄 알아야한다.

단순히 하드 코딩이라 생각하고, 변수명이 나쁘다고 생각하여 코드를 개선하자가 아니라

왜 코드를 개선했는지, 그리고 코드를 개선하여 어떤 장점이 있어서 리소스를 들여서 개선했는지 알아야한다.

리소스를 들여서 개선하는 경우 미래에 어떤 이점이 있을까?

객체지향 설계의 원칙과는 어떤 상관이 있는지 알아야한다.

스프링은 결론을 내리지 않고 개발자가 객체지향 프로그래밍을 하도록 도와줄 뿐이라는 것을 책에서 말합니다.

반성하는 일

정상적으로 동작하는 코드를 개선하는 이유가 무엇인지 고민은 했지만 정의를 내린 적이 없었습니다.

코드가 지저분하고, 객체지향 프로그래밍 방식이 아니고, 하드코딩으로 설정 값이 코드에 들어있다는 이유로 코드를 개선했습니다.

물론, 문제라고 정의했기에 코드를 수정한건 맞지만 문제를 개선하여 어떤 이점이 생기는지 까지 고민을 하지 않고 코드를 개선하다보니

오히려 코드를 개선한 이후 코드가 더 가독성이 나빠지고, 코드의 딱딱한 유연성은 그대로 있던 경우가 잦았다는 걸 알았습니다.

책에서 말하고자 하는것

스프링을 학습할 때 문제 제기와 의문에 해답을 찾아나가는 과정이라고 합니다.

코드를 작성할 때 단순하게 기계적으로 외우거나 성급하게 결론 내리지 말라고 합니다.

최종 결론은 개발자가 좋은 결론을 내릴 수 있도록 스프링을 학습하면서 객체지향 프로그래밍을 공부하는 자세입니다.

댓글남기기