💡 PSA(Portable Service Abstractions) 서비스 추상화 지금까지 만들었던 UserDao는 User 오브젝트에 담겨 있는 사용자 정보를 등록, 조, 수정, 삭제하는 CRUD라고 불리는 가장 기초적인 작업만 가능합니다. 여기에 사용자 레벨을 관리할 수 있는 다음과 같은 비즈니스 로직을 추가해보겠습니다. 사용자의 레벨은 BASIC, SILVER, GOLD 세 가지 중 하나입니다.사용자가 처음 가입하면 BASIC 레벨이 되며, 이후 활동에 따라 다음 조건에 맞추어 한 단계씩 업그레이드될 수 있습니다.가입 후 50회 이상 로그인하면 SILVER 회원이 됩니다.SILVER 레벨인 상태에서 추천을 30번 이상 받으면 GOLD 회원이 됩니다.사용자 레벨의 변경 작업은 주기를 가지고 일괄적으로 ..
✅ 인터페이스 적용지금까지 만들어서 써왔던 userDao 클래스를 이제 인터페이스와 구현으로 분리해보자. 인터페이스의 이름은 가장 단순하게 하고, 구현 클래스는 각각의 특징을 따르는 이름을 붙이는 경우로 만들어 보자. UserDao interfacepackage com.jhcode.spring.ch4.user.dao; import java.util.List; import java.util.Optional; import com.jhcode.spring.ch4.user.domain.User; public interface UserDao { void add(User user); Optional get(String id); List getAll(); void deleteAll(); int getCount(); ..
🔥모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. ✅ 초난감 예외처리UserDao, deleteAll()//== 테이블 전체 데이터 삭제 ==// public void deleteAll() { String sql = "DELETE FROM users"; //콜백 객체 생성을 내장 함수가 담당한다. this.jdbcTemplate.update(sql); } deleteAll() 메소드를 보면 기존의 throws SQLException 키워드가 사라진 것을 볼 수 있다. catch로 잡은 예외는 어디로 가는 것일까? 예외가 발생하면 그것을 catch 블록을 써서 잡아내는 것까지는 좋은데 그리고 아무것도 하지 않고 넘어가 버리는 건 정말 위험한 일이다...
✅ 테스트 보완(Negative Test)🔥현명한 개발자가 되려면, 긍정적인 결과만 테스트하는 것이 아니라 부정적인 결과로써의 테스트도 반드시 해보아야 한다. Spring에서 네거티브 테스트는 소프트웨어 개발 중에 발생할 수 있는 예외 상황이나 오류에 대해 테스트하는 절차이다. 이러한 테스트는 코드의 일부분이 의도한 대로 작동하지 않거나 예상치 못한 결과를 초래할 수 있는 부분을 식별하고 수정하기 위해 사용된다. ➡️ 네거티브 테스트는 보통 다음과 같은 시나리오에서 사용된다.예외 처리 테스트메서드 또는 함수에서 발생할 수 있는 예외 상황을 확인하는 테스트이다. 예를 들어, 유효하지 않은 입력이 주어졌을 때 적절한 예외가 발생하는지 확인하는 등의 테스트를 포함한다. 경계 조건 테스트입력 값의 경계 조건에 ..
💡지금까지 템플릿/콜백 패턴을 만드는 방법, 동작 원리 등을 알아봤다. 이제 스프링이 제공하는 JDBC 템플릿/콜백 기술을 알아보자. ✅ JdbcTemplate앞에서 만들었던 JdbcContext와 유사하지만 훨씬 강력하고 편리한 기능을 제공해준다. JdbcTemplate은 스프링 프레임워크에서 제공하는 데이터베이스 연동을 위한 도구이다.SQL 쿼리 실행과 결과 처리를 단순화하는 간결한 API를 제공한다.데이터베이스 연결 및 트랜잭션 관리를 자동으로 처리하여 개발자가 별도로 구현할 필요가 없다.JDBC(Java Database Connectivity)를 기반으로 동작하며, 데이터베이스 종류에 상관없이 사용할 수 있다.PreparedStatement를 활용하여 SQL 쿼리의 매개변수화와 자동 리소스 관리를..
✅ 자주 반복되는 코드가 있다면?자주 반복되는 코드, 즉 중복된 코드가 있다면 앞에서 배운 것들을 통해 이를 분리하는 방법을 생각해낼 수 있다. 먼저 메소드로 분리하는 간단한 방법을 시도해본다.필요에 따라 바꾸어 사용해야 한다면 인터페이스를 사이에 두고 전략패턴과 DI를 사용한다.바뀌는 부분이 한 어플리케이션 안에서 동시에 여러 종류가 만들어진다면 템플릿/콜백 패턴을 적용한다. ✅ try-catch-finally 응용하기간단한 템플릿/콜백 예제를 만들어서 응용해보자.파일을 하나 열어서 모든 라인의 숫자를 더한 합을 돌려주는 계산기 코드를 만들어 보자. 👉 갑자기 파일 입출력과 관련된 클래스가 나와서 당황할 수도 있지만, 코드를 자세히 살펴보면 전혀 어려운 코드가 아니다. numbers.txtUntitle..
✅ 템플릿 콜백 패턴이란 무엇인가?템플릿 콜백 패턴은 템플릿 메소드 패턴과 콜백 패턴을 결합한 디자인 패턴이다. 이 패턴은 알고리즘의 기본 구조를 템플릿 메소드로 정의하고, 일부 동작을 콜백 메소드로 위임하여 구체적인 구현을 서브클래스에서 처리한다. 이를 통해 알고리즘의 확장성과 재사용성을 높일 수 있다. 지금까지 템플릿/콜백 패턴을 적용한 것이다. 🔹템플릿 메소드 패턴이란?템플릿 메소드는 부모 클래스에서 알고리즘의 골격(구조)을 정의하고, 자식 클래스에서 부모 클래스를 상속 받아 구현할 때 알고리즘의 전체 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계의 메소드를 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴이다. 앞에 1장에서 UserDao의 getConnection() 메소드를 ..
✅ 전략 클래스의 추가 정보앞에서 JDBC 전략 패턴을 적용하기 위해, 클라이언트와 컨텍스트를 분리하고 deleteAll() 메서드를 사용할 때 DI 구조로 사용할 수 있게끔 만들었다. add() 에도 동일하게 적용해 보자. StatementStrategy를 구현한 AddStatement 클래스를 생성하고 add() 메서드의 내용을 옮기자. AddStatementpackage com.jhcode.spring.ch3.user.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import com.jhcode.spring.ch3.user.domain.User; public class A..
💡스프링(Spring)에서 템플릿(Template)은 일반적으로 데이터 액세스 작업을 수행하는 데 사용되는 디자인 패턴을 의미한다. 더 나아가 데이터 액세스 작업에 국한되지 않고, 다른 작업(예: 웹 서비스 호출, 캐싱 등)에도 확장하여 사용할 수 있다. 스프링에서 제공하는 여러 템플릿 중에서 가장 널리 사용되는 것은 JdbcTemplate이다. ✅ 예외처리 기능을 갖춘 DAOJDBC 코드에는 반드시 예외처리를 해야한다. 어떤 이유로든 예외가 발생했을 경우에 사용한 리소스를 반환해야한다. 서버는 제한된 개수의 DB 커넥션을 만들어 재사용이 가능한 풀(pool)로 관리한다. 만약 예외가 발생해서 리소스가 반환되지 않는다면 오류를 내며 중단될 것이다. 🔎—try-catch-finally try-catch-f..
✅ POJO(Plain Old Java Object)란?POJO는 Plain Old Java Object의 약어로, 일반적인 Java 객체를 의미합니다. POJO는 특정한 프레임워크나 라이브러리에 종속되지 않고, 순수한 Java 클래스로 작성된 객체를 말합니다. ➡️ POJO는 다음과 같은 특징을 가지고 있습니다자바 클래스 형태POJO는 일반적인 자바 클래스로 작성되며, 특정한 인터페이스를 구현하거나 클래스를 상속받지 않습니다. 이는 POJO를 재사용 가능하고 독립적으로 사용할 수 있도록 합니다. 외부 의존성 최소화POJO는 외부 프레임워크나 라이브러리에 대한 의존성을 최소화합니다. POJO 객체는 순수한 Java 객체로서, 특정한 프레임워크나 라이브러리에 종속되지 않고 독립적으로 동작할 수 있습니다. ..