본문 바로가기

Spring&SpringBoot31

콜백 분리 연습 3장 5절에서 Calculator 예제를 이용해 콜백(반복되지 않는 부분)을 분리하는 연습을 했다. 텍스트 파일의 숫자를 한줄씩 읽어 누적합과 누적곱 계산, 문자열처럼 연결하는 기능을 구현했다. 세 단계를 거쳐서 콜백을 분리했다. 콜백 분리 : 리소스 생성, 예외 처리, 리소스 닫기로 구성된 변하지 않는 부분으로부터, 파일 내용으로 무언가를 하는 변경되는 부분을 분리했다. Row 콜백 분리 : 라인을 하나씩 읽어 기존값에 연산을 적용하는 변하지 않는 부분으로부터, 합 혹은 곱이 적용되는 연산 종류를 분리했다. 콜백에 제네릭 적용 : 라인을 하나씩 읽어 기존값에 연산을 적용하는 변하지 않는 부분으로부터, 타입과 연산 종류를 분리했다. (제네릭 타입 콜백) 중복이 발생한 코드의 모습 filePath를 인자로.. 2023. 3. 13.
반복되는 부분으로부터 반복되지 않는 부분을 분리하는 패턴 동일한 목적을 수행하는 세 가지 패턴 코드를 작성하다보면 반복되는 요구사항에 대해 중복된 코드가 만들어지기 마련이다. 중복 코드는 가시적인 코드 스멜의 주범이다. 이 문제를 해결하기 위한 디자인 패턴을 알아보자. 반복되는 부분과 반복되지 않는 부분을 분리하기 위한 패턴은 총 세 가지다. (1) 전략 패턴 (2) 템플릿 메소드 패턴 (3) 템플릿 콜백 패턴. 목적이 동일하므로 필요로 하는 역할도 동일하다. 반복되는 부분을 담는 역할, 반복되지 않는 부분을 담는 역할, 이 둘의 의존성을 주입하는 역할, 그리고 이 연결관계가 만들어진 두 객체를 사용하는 역할이다. 세 가지 패턴을 구분하는 것은 구현 방법이다. 목적은 동일하지만 구현 방법이 약간 다르다. 전략 패턴은 인터페이스를 두어 전략 클래스를 구현하고, .. 2023. 3. 13.
템플릿 콜백 패턴으로 가독성 높이기 전략 패턴을 사용해서 변경되지 않는 코드를 컨텍스트에 두고, 변경되는 코드는 인터페이스를 두어 전략 클래스를 구현했다. 클라이언트는 전략 클래스를 생성해 컨텍스트에게 주입하여 사용했다. 이 방법, 다 좋은데.. dao 메소드마다 새로운 구현 클래스를 만드니 클래스 개수가 많아져 번잡스럽다. 어차피 한번 쓰고 말건데! 또 클래스를 분리하니 User와 같이 외부 정보가 필요할 때 매개변수를 받아야 한다. 이 문제를 한번 개선해보자. 익명 내부 클래스로 개선하기 그렇다면 익명 내부 클래스를 사용하자! Dao 안에서 StatementStrategy(전략 인터페이스)를 구현할 수 있으니, 메소드마다 클래스 파일을 따로 만들지 않아도 된다. 필요한 정보가 있으면 내부 필드로 바로 접근 가능하므로 매개변수가 필요하지.. 2023. 3. 13.
반복되는 예외처리, 전략 패턴으로 개선하기 문제 상황 Dao의 JDBC를 이용하는 메소드에서 예외 처리를 해주었더니 유사한 try-catch-finally 문이 반복된다. 계속 이렇게 복붙해서 쓰다가 실수라도 하면 예외 처리가 제대로 안돼서 시스템에 문제가 발생할 수도 있고, 무엇보다 너무 지저분하다. 유지 보수도 어려울 것이다. 반복되는 코드를 캡슐화해서 중복을 줄여보자! // 중복되는 예외 코드 public void deleteAll() throws SQLException { Connection c = null; PreparedStatement ps = null; try { c = dataSource.getConnection(); ps = c.prepareStatement("delete from users"); ps.executeUpdate(.. 2023. 3. 13.
스프링을 사용한 테스트 스프링을 사용하는 테스트는 애플리케이션 컨텍스트가 동작하는 환경에서 빈이 잘 동작하는지를 확인하고 싶을 때 쓴다. 그게 의도가 아니라면 애플리케이션 컨텍스트와 독립적인 유닛 테스트를 작성한다. 애플리케이션 컨텍스트는 생성 비용이 많이 들기 때문에, 애플리케이션 컨텍스트는 생성하면 테스트에서 공유한다. 테스트 전용 설정을 사용하고 싶다면 수동 DI보다는 테스트 전용 설정 파일을 만든다. 테스트를 위한 애플리케이션 컨텍스트 관리 애플리케이션 컨텍스트가 만들어질 때는 모든 싱글톤 빈 오브젝트를 초기화한다. 애플리케이션 컨텍스트는 비용이 많이 드는 편이고, 생성 후에는 변경이 잘 발생하지 않는다. 이런 경우에는 테스트 전체가 공유하는 오브젝트를 만든다. JUnit이 제공하는 @BeforeClass 스태틱 메소드.. 2023. 3. 8.
테스트 도구 JUnit와 객체지향을 위한 테스트 주도 설계 기법 JUnit 소개 JUnit은 사실상 자바의 표준 테스팅 프레임워크다. 스프링 테스트 모듈이 JUnit을 이용하며, 스프링 프레임워크 자체도 JUnit을 사용해 만들어졌다. 애플리케이션 규모가 커지면 테스트가 많아지고, 테스트 수행 부담이 커진다. JUnit은 테스트 결과를 종합해서 보고 실패한 곳을 빠르게 확인하는 뷰를 제공한다. 또 일관적인 실행 결과를 위해 패턴을 지원하고, 많은 테스트를 간단히 실행시킬 수 있다. JUnit의 테스트 메소드 실행 방법 JUnit은 테스트 메소드가 실행될 때마다 새로운 테스트 인스턴스를 생성한다. 그 이유는 테스트가 독립적으로 실행됨을 보장하기 위함이다. JUnit이 하나의 테스트 클래스를 가져와 테스트를 수행하는 방법은 다음과 같다. 테스트 클래스에서 @Test가 붙.. 2023. 3. 8.