전체 글

전체 글

    상속보다는 컴포지션을 사용하라 - [4장. 클래스와 인터페이스(아이템18)]

    상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법이다. 확장할 목적으로 설계되었고 문서화도 잘 된 클래스도 마찬가질 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 여기서 다룰 '상속'은 클래스가 다른 클래스를 확장하는 '구현 상속'을 말한다. 클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 '인터페이스 상속'과는 무관한 것이다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 문제가 발생하는 2가지 이유에 대해서 알아보고 해결책에 대해서 알..

    변경 가능성을 최소화하라(불변 클래스를 만들 때 고려할 것)(3) - [4장. 클래스와 인터페이스(아이템17)]

    이전 글 변경 가능성을 최소화하라(불변 클래스를 만드는 다섯 가지 규칙)(1) - [4장. 클래스와 인터페이스(아이템17)] 변경 가능성을 최소화하라(불변 클래스의 장점, 단점, 단점 대처 방법)(2) - [4장. 클래스와 인터페이스(아이템17)] 이번 글에서는 '불변 클래스를 만들 때 고려할 것'에 대해서 알아보자. 1. 상속을 막을 수 있는 또 다른 방법 🦓 이전 글을 통해 불변 클래스를 보장하려면 자신을 상속하지 못하게 해야 한다는 것을 알 수 있었다. 자신을 상속하지 못하게 하는 가장 쉬운 방법으로 final 클래스에 대해서 알아보았다. 하지만 더 유연한 방법이 있다. 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리를 제공하는 방법이다. // 1...

    변경 가능성을 최소화하라(불변 클래스의 장점, 단점, 단점 대처 방법)(2) - [4장. 클래스와 인터페이스(아이템17)]

    이전 글 변경 가능성을 최소화하라(불변 클래스를 만드는 다섯 가지 규칙)(1) - [4장. 클래스와 인터페이스(아이템17)] 이번 글에서는 불변 클래스의 장점, 단점, 그리고 단점 대처 방법에 대해서 알아보자. 1. 장점 🚑 📘 장점 1. 함수형 프로그래밍에 적합하다. public final class Complex { private final double re; private final double im; public Complex(double re, double im) { this.re = re; this.im = im; } public double realPart() { return re;} public double imaginaryPart() {return im;} public Complex pl..

    변경 가능성을 최소화하라(불변 클래스를 만드는 다섯 가지 규칙)(1) - [4장. 클래스와 인터페이스(아이템17)]

    불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스를 말한다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴는 순간까지 절대 달라지지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다는 이점이 있다. 아이템 17에서는 아래 3가지 내용을 다루고 있다. 불변 클래스를 만드는 다섯 가지 규칙 불변 클래스의 장점, 단점, 단점 대처 방법 불변 클래스를 만들 때 고려할 것 이번 글에서는 '1. 불변 클래스를 만드는 다섯 가지 규칙'에 대해서 알아보자. 1. 객체의 상태를 변경하는 메서드를 제공하지 않는다. 🚕 public class PhoneNumber { private short areaCode, prefix, lineNum; pub..

    메시지 & 국제화 (Message & Internationalization)

    1. 개념 🍓 1. 메시지 (Message) 화면에 보이는 '상품명'이라는 단어를 '상품이름'으로 바꾸고 싶을 경우 어떻게 해야 할까? 간단하게는 item.html에서 해당 단어를 바꾸면 된다. 하지만 상품명이라는 단어가 item.html, addItem.html, updateItem.html, deleteItem.html, ... 에서 사용되고 있다면 모든 파일을 고쳐야 한다는 문제가 있다. 이렇게 HTML 파일에 메시지를 하드코딩되어 있도록 하는 게 아니라, 메시지를 한 곳에서 관리하도록 할 수 있는데 이것이 바로 메시지 기능이다. 2. 국제화 (Internationalization) 한국어를 사용하는 사람에게는 '상품명', 영어를 사용하는 사람에게는 'Item Name'으로 보여주고자 한다. 이를 ..

    public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - [4장. 클래스와 인터페이스(아이템16)]

    제목에서와 같이 public 클래스를 사용할 경우 public 필드가 아닌 접근자 메서드를 사용하는 것을 권장하고 있다. 1. public 클래스에서 public 필드를 사용했을 경우의 문제점 🥞 public class Point { public double x; public double y; } 위와 같은 클래스는 데이터 필드에 직접 접근할 수 있으므로 캡슐화의 이점을 제공하지 못한다. 그에 따라서 다음과 같은 문제점을 가지게 된다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다. 2. public 클래스에서 접근자 메서드를 사용했을 경우의 이점 🧇 public class Point { private double ..

    HTTP 응답(정적 리소스, 뷰 템플릿, HTTP 메시지) 처리

    스프링(서버)에서 응답 데이터를 만드는 방법은 크게 3가지가 있다. 정적 리소스 웹 브라우저에 정적인 HTML, CSS, JS를 제공할 때 정적 리소스를 사용한다. 뷰 템플릿 사용 웹 브라우저에 동적인 HTML을 제공할 때 뷰 템플릿을 사용한다. HTTP 메시지 사용 HTTP API를 제공하는 경우에는 HTML이 아니라 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 제공한다. 하나씩 자세히 알아보자. 1. 정적 리소스 🥪 정적 리소스란 해당 파일을 변경 없이 그대로 서비스하는 것을 말한다. 스프링 부트는 클래스패스에 아래의 디렉토리에 있는 정적 리소스를 제공한다. /static /public /resources /META-INF/resources src/main/resources가 클래스패스의 ..

    HTTP 요청(헤더, 파라미터, 메시지) 처리

    애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다. 헤더 정보 조회 요청 파라미터 조회 (1) 요청 파라미터 직접 조회(@RequestParam) (2) 객체를 이용한 조회(@ModelAttribute) 요청 메시지 조회 (1) 단순 텍스트 (@RequestBody) (2) JSON 하나씩 자세히 알아보자. 1. 헤더 정보 조회 🍕 HTTP 헤더 정보를 아래와 같이 조회할 수 있다. @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletRequest response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap h..

    스프링 MVC

    1. 개념 🌻 스프링 MVC을 배우기 전에 MVC 패턴을 먼저 설명하자면 아래와 같다. MVC 패턴이란 Model, View, Controller라는 영역으로 서로 역할을 나눈 것을 말한다. Controller HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다. Model 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해 주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다. View 모델에 담겨있는 데이터를 사용해서 화면을 그린다. MVC 패턴의 문제점은 공통 처리가 어렵다는 것이다. 기능이 복잡해질수록 컨트롤러에서 처리해야 하는 부분이 점점 ..

    서브쿼리(Subquery)

    1. 개념 🍰 서브쿼리(Subquery)란 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미한다. 서브쿼리를 포함하고 있는 쿼리를 외부 쿼리(Outer Query) 또는 메인 쿼리(Main Query)라고 부르며, 서브 쿼리는 내부 쿼리(Inner Query)라고 부른다. 서브 쿼리는 반드시 괄호로 감싸져서 표현되어야 한다. 2. 종류 🍪 서브 쿼리의 위치에 따라서 3가지 종류로 나눌 수 있다. SELECT 컬럼1, 컬럼2, (SELECT ...) -- 스칼라 서브 쿼리(Scalar Subquery) FROM (SELECT ...) -- 인라인 뷰(Inline View) WHERE col = (SELECT ...) -- 중첩 서브 쿼리(Nested Subquery) 스칼라 서브 쿼리(Scalar S..

    의존성 주입 - DI(Dependency Injection)

    1. 개념 🦗 DI(Dependency Injection = 의존성 주입 = 의존관계 주입)를 알기 위해서는 우선 IoC(Inversion of Control = 제어의 역전)를 알아야 한다. IoC란 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌 외부에서 결정하는 것이다. 여기서 외부란 Spring Framework를 뜻한다. // 기존 public class DictionaryService { KoreanDictionary koreanDictionary = new KoreanDictionary(); } // IoC 적용 public class DictionaryService { Dictionary dictionary; } 기존에는 객체를 클래스 내부에서 생성하고 사용했지만 IoC를 적용하면..

    조인(JOIN)

    1. 개념 🐪 보통 데이터베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 몇 개의 테이블로 나누어 저장한다. 이처럼 여러 개로 나누어진 데이터를 하나로 묶어 결과를 내기 위하여 JOIN을 사용한다. JOIN은 크게 INNER JOIN OUTER JOIN SELF JOIN 으로 나누어진다. 하나씩 살펴보도록 하자. 2. INNER JOIN 🐫 가장 일반적인 JOIN의 종류이며 교집합을 표현한다. INNER JOIN은 어느 테이블을 먼저 읽든 조인 관계에 부합되는 레코드를 모두 가지게 된다. 조인의 순서가 중요하지 않다. INNER JOIN은 아래의 4가지 방법으로 표현할 수 있다. 1. ON 사용 SELECT a.a1, b.b1 FROM a_table a INNER JOIN b_table b ON a..