교재 실습315 8장 AJAX를 활용해 새로고침 없이 데이터 갱신하기 회원관리 기능을 구현하면서 많은 중복을 제거했고, 새로운 개념들도 익힐 수 있는 기회였다. 지금까지 누군가 구현해 놓은 프레임워크, 라이브러리만 사용하다 프레임워크와 라이브러리를 직접 구현하는 경험도 했다.이번 장에서는 직접 구현한 프레임워크와 라이브러리를 활용해 질문/답변 게시판을 구현한다. 질문/답변 게시판을 구현하면서 사용자 경험을 한 단계 더 높여줄 AJAX 기술을 활용해 답변을 추가, 삭제하는 기능을 구현할 계획이다. AJAX를 활용하는 과정에서 서버측은 HTML이 아닌 JSON 데이터로 응답하도록 구현한다. 마지막 경험은 서버 측에서 HTML과 JSON 두 가지 형태의 응답을 함으로써 발생하는 MVC 프레임워크의 문제점을 살펴보고 이를 개선하는 과정을 살펴본다.참고도서 : https://roa.. 2025. 7. 30. 7.5.2 디자인 패턴 디자인 패턴에서 가장 유명한 책으로 알려진 "GoF의 디자인 패턴 : 재사용성을 지닌 객체지향 소프트웨어의 핵심요소"(에릭 감마 저/김정아 역, 프로텍미디어/2015년) 책은 1994년에 출간된 책으로 개발 경험이 많은 4명의 개발자가 개발 과정에서 자주 나타나는 패턴을 정리한 책이다.디자인 패턴은 개발 경험을 쌓은 후 학습해도 괜찮다고 생각한다. 먼저 자신의 코드에서 리팩토링할 부분을 찾아 작은 부분이라도 리팩토링을 통해 소스코드를 개선하는 경험이 우선이다. 이런 경험을 반복하다 보면 일정한 패턴을 스스로 찾는 경험도 할 수 있다.디자인 패턴을 학습하고 싶다면 처음 책은 "Head First Design Patterns : 스토리가 있는 패턴 학습법"(에릭 프리먼 저 / 서환수 역, 한빛미디어/2005.. 2025. 7. 29. 7.5.1 데이터베이스 이 책이 나온 시점에 가장 많이 사용되고 있는 데이터베이스는 관계형 데이터베이스(RDBMS) 이다. 따라서 관계형 데이터베이스의 SQL을 기본으로 반드시 학습해야 한다. SQL에 대한 기본적인 학습이 끝났다면 다음 단계로 학습할 내용은 성능을 고려한 설계 및 인덱스 활용에 대한 학습이다. 이 내용과 관련해 깊이 있게 학습하지는 못하더라도 ER 다이어그램, 인덱스, 정규화, 트랜잭션과 같이 데이터베이스의 핵심 내용은 학습해야 한다.이와 같은 기본적인 내용은 초보 개발자를 위한 데이터베이스 책에서 대부분 다루고 있다. 1장에서 추천한 "SQL 첫걸음 : 하루 30분 36강으로 배우는 완전 초보의 SQL 따라잡기"(아사이 아츠시 저/박준용 역, 한빛미디어/2015년) 책에도 최소한의 내용은 포함하고 있다.데이.. 2025. 7. 28. 7.4.12 람다를 활용한 구현 가변인자까지 추가한 결과 UserDao 코드는 정말 깔끔해졌다. 지금 단계로도 충분히 만족스럽다. 만약 여기서 리팩토링을 한 단계 더 진행하고 싶다면 자바 8 버전에서 추가된 람다 표현식을 활용할 수 있다. UserDao 에서 RowMapper 에 대한 익명 클래스를 생성하던 부분을 다음과 같이 람다를 활용해 좀 더 깔끔하게 구현할 수 있다. - UserDao.javapublic class UserDao { public User findByUserId(String userId) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); String sql = "SELECT userId, password, name, email FROM USERS.. 2025. 7. 27. 7.4.11 가변인자를 활용해 쿼리에 인자 전달하기 쿼리에 값을 전달할 때 PreparedStatementSetter 를 활용할 수도 있지만 가변 인자를 활용해 값을 전달할 수도 있다. JdbcTemplate 에 가변인자를 활용하는 새로운 update() 메서드를 추가한다. - JdbcTemplate.javapublic class JdbcTemplate { public void update(String sql, Object... parameters) throws DataAccessException { try (Connection conn = ConnectionManager.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { .. 2025. 7. 27. 7.4.10 제너릭(generic)을 활용한 개선 JdbcTemplate 을 사용해보니 데이터를 조회할 때 매번 캐스팅을 해야 한다는 점이 불편하다. 자바의 제너릭을 적용해 캐스팅 하지 않도록 개선한다. - RowMapper.javapublic interface RowMapper { T mapRow(ResultSet rs) throws SQLException;} 위와 같이 자바의 제너릭 문법을 사용하도록 RowMapper 를 수정한 후 JdbcTemplate 에도 제너릭 구문을 추가한다. - JdbcTemplate.javapublic abstract class JdbcTemplate { public void update(String sql, PreparedStatementSetter pss) throws DataAccessException {.. 2025. 7. 26. 7.4.9 런타임 Exception 추가 및 AutoClosable 활용한 자원 반환 UserDao 문제점 중의 하나는 모든 메서드가 컴파일타임 Exception 인 SQLException 을 throw 한다는 것이다. 런타임 Exception 을 추가해 이 문제점을 해결해 본다. 먼저 RuntimeException 을 상속하는 새로운 Exception 을 추가한다. - DataAccessException.javapackage core.jdbc;public class DataAccessException extends RuntimeException { private static final long serialVersionUID = 1L; public DataAccessException() { super(); } public DataAccessExceptio.. 2025. 7. 24. 7.4.8 인터페이스 추가를 통한 문제점 해결 이 같은 문제점이 생기는 원인은 JdbcTemplate 의 추상 메서드의 변화 시점이 다를 수 있는데, 항상 같이 변화하도록 의존관계가 생겼기 때문이다. setValues() 메서드와 mapRow() 메서드를 분리해 서로 간의 의존관계를 끊어버릴 수만 있다면 좀 더 유연한 개발이 가능하도록 지원할 수 있다. 이를 해결하려면 두 개의 추상 메서드를 같은 클래스가 가지도록 구현하지 말고, 각각의 추상 메서드를 인터페이스를 통해 분리할 수 있다. - PreparedStatementSetter.javapublic interface PreparedStatementSetter { void setValues(PreparedStatement pstmt) throws SQLException;} - RowMapper.. 2025. 7. 23. 7.4.7 JdbcTemplate 과 SelectJdbcTemplate 통합하기 지금까지 리팩토링 과정을 통해 UserDao 에 있던 많은 중복 코드를 제거했다. 이제 모든 SQL에 대한 처리를 공통 라이브러리를 활용해 해결할 수 있게 되었다. 그런데 개발자 입장에서 생각해보면 API를 사용할 때 여러 개의 클래스를 제공하는 것보다 클래스 하나를 제공하는 것이 학습 측면에서 더 좋을 것이다. JdbcTemplate 과 SelectJdbcTemplate 클래스의 구현 부분을 보니 중복 코드도 많아 클래스 하나로 통합하는 것이 좋겠다. 두 개의 클래스를 JdbcTemplate 하나로 통합한다. - JdbcTemplate.javapublic abstract class JdbcTemplate { public void update(String sql) throws SQLException.. 2025. 7. 22. 이전 1 2 3 4 5 6 7 ··· 35 다음