전체 글 41

토비의 스프링 3장 - 템플릿

템플릿이란? 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 활용할 수 있도록 하는 방법이다. 다시 보는 초난감 DAO DB 커넥션처럼 제한적인 리소스를 공유해 사용하는 서버에서 동작하는 JDBC 코드는 예외처리가 반드시 필요하다. 예외가 발생하더라도 사용한 리소스를 반환해줘야 하기 때문이다. public void deleteAll() throws SQLException { Connection c = dataSource.getConnection(); PreparedStatement ps = c.prepareStatement("delete from users"); ps.executeUpdate(); ps..

토비의 스프링 2장 - 테스트

현대의 앱이 복잡해져 가며, 테스트의 중요성은 더욱 높아지고 있고, 스프링에서는 테스트를 쉽게 해주는 도구들을 제공한다. 작은 단위의 테스트 한꺼번에 너무 많은 것을 몰아서 테스트하면 테스트 수행 과정도 복잡해지고, 오류가 발생했을 때 정확한 원인을 찾기가 힘들어진다. 따라서 테스트는 작은 단위로 쪼개서 하는 것이 좋다. 여기서 말하는 작은 단위는 어느 정도인지 정해진 것이 아니지만, 일반적으로 단위는 작을수록 좋다. 좋은 테스트의 특징 테스트의 일관성 외부 영향에 상관이 없어야 하고, 반복적으로 테스트를 해도 항상 동일한 결과를 내야 한다. 중복된 데이터로 문제가 일어날 수 있는 경우는 테스트를 수행 후 사용자 정보를 삭제해서 수행하기 이전 상태를 만들어주는 것이다. 포괄적인 테스트 네거티브 테스트 부..

토비의 스프링 1장 - 오브젝트와 의존관계

스프링이 가장 관심을 많이 두는 대상은 오브젝트다. 이 오브젝트를 이해해야 스프링을 이해할 수 있다. 이번 장에서는 오브젝트의 설계와 구현, 동작원리를 알아보자. 초난감 DAO 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", "spring", "book"); PreparedStatement ps = c.prepareStatement("insert into users(id,..

[클린 코드] 요약 및 정리

[의미 있는 이름] 다른 사람이 봐도 알아볼 수 있게 이름을 지으라. 서로 흡사한 이름을 사용하여 않도록 주의한다. 검색하기 쉬운 이름을 사용하자 [함수] 1. 함수는 하나의 역할만 해야 한다. 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 하는 것이다. public Money calculatePay(Employee e) throws InvalidEmployeeType { switch(e.type) { case COMMISSIONED: return calculateCommisionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); d..

책 리뷰 2023.03.25

[모던 자바 인 액션] 14장. 자바 모듈 시스템

압력: 소프트웨어 유추 지금까지는 이해하고 유지보수하기 쉬운 코드를 구현하는 데 사용할 수 있는 새로운 언어 기능을 살펴봤다. 하지만 이러한 부분은 저수준의 영역에 해당하며, 소프트웨어 아키텍처에 해당하는 고수준의 영역에서는 생산성을 높일 수 있도록 추론하기 쉬운 소프트웨어 프로젝트가 필요하다. 관심사 분리 정보 은닉 관심사 분리 관심사 분리는 컴퓨터 프로그램을 고유의 기능으로 나누는 동작을 권장하는 원칙이다. 모델, 뷰, 컨트롤러 같은 아키텍처 관점 그리고 비즈니스 로직과 분리 등 수준 접근에 용이하고 다음과 같은 장점들이 더 있다. 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업할 수 있다. 개별 부분을 재사용하기 쉽다. 전체 시스템을 쉽게 유지보수할 수 있다. 정보 은닉 정보 은닉은 세부 구현..

[모던 자바 인 액션] 13장. 디폴트 메서드

자바에서 인터페이스와 메서드는 한 몸처럼 구성된다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 하지만 인터페이스를 수정하려고 할 때 문제가 발생한다. 자바 8에서는 이 문제를 해결하기 위해 정적 메서드와 디폴트 메서드 기능을 사용하여 해결했다. 디폴트 메서드란 무엇인가? 인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다. 그래서 이를 디폴트 메서드라고 부른다. 디폴트 메서드를 어떻게 알아볼 수 있을까? 디폴트 메서드는 default 키워드로 시작하며 다른 클래스에 선언된 메서드처럼 메서드 바디를 포함한다. public interface Sized { int size(); default..

[모던 자바 인 액션] 12장 새로운 날짜와 시간 API

LocalDate, LocalTime, Duration, Period 클래스 간단한 날짜와 시간 간격을 정의해 보자. LocalDate와 LocalTime LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체다. LocalDate 객체는 어떤 시간대 정보도 포함하지 않는다. 팩토리 메소드 now()는 시스템 시계의 정보를 이용해 현재 날짜 정보를 얻는다. LocalDate와 LocalTime은 게터 메서드를 제공한다. LocalDate date = LocalDate.of(2017, 9, 21) date.getYear() LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20 time.getHour(); // 13 time.getMinute(); ..