이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 잘 설계된 모듈과 그렇지 못한 모듈을 구별 짓는 가장 중요한 속성 하나는 모듈 내부의 데이터를 비롯한 구현 세부사항을 다른 모듈에 잘 감추느냐의 여부다.잘 설계된 모듈은 구현 세부사항을 전부 API 뒤쪽에 감춘다. 정보은닉(information hiding) 또는 캡슐화(encapsulation)라는 용어로 알려져 있다.정보은닉은 시스템을 구성하는 모듈 사이의 의존성을 낮춘다(decouple). 1. 각 클래스와 멤버는 가능한 접근 불가능하도록 만들어야 한다 최상위 레벨 클래스나 인터페이스는 가능한 package-private로 선언 public으로..
이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 기능적으로 동일한 객체는 필요할 때마다 만드는 것보다 재사용하는 편이 낫다. 1. 변경 불가능(immutable) 객체는 언제나 재사용할 수 있다. String s = new String("stringette"); String s = "stringette"; // 바람직 순환문이나 자주 호출되는 메서드 안에 있을 경우 차이. 아래의 경우 가상 머신(virtual machine)에서 실행되는 모든 코드가 해당 String 객체를 재사용. new Boolean("true"); Boolean.valueOf("true"); // 대체로 더 바람직 생성자와 ..
이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 java.lang.Math, java.util.Arrays, java.util.Collections 같은 유틸리티 클래스(utility class)들은 객체를 만들 목적의 클래스가 아니다. private 생성자를 이용한 객체 생성 방지 public class UtilityClass { // 기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 private UtilityClass() { throw new AssertionError(); } } AssertionError는 반드시 필요한 것은 아니지만, 클래스 안에서 실수로 생성자를 호출하면 바로 알 ..
이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 JDK 1.5 이전에는 싱글턴을 구현하는 방법이 두 가지 였다. 1. 정적 멤버는 final로 선언 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } private 생성자는 pulic static final 필드인 Elivs.INSTANCE를 초기화 할 때 한 번만 호출된다. 2. public으로 선언된 정적 팩터리 public class Elvis { pri..
이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 정적 팩터리나 생성자는 선택적 인자가 많은 상황에서 잘 적응하지 못한다. 1. 점층적 생성자 패턴(telescoping constructor pattern) 보통 프로그래머들은 이런 상황에 점층적 생성자 패턴을 적용한다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts(int servingSize, int ser..
이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 Boolean 클래스의 예 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 1. 생성자와 달리 정적 팩터리 메서드에는 이름이 있다. 정적 팩터리는 이름을 잘 짓기만 한다면 사용하기도 쉽고, 클라이언트 코드의 가독성도 높아진다. 같은 시그니처를 갖는 생성자를 여러 개 정의할 필요가 있을 때는 그 생성자들을 정적 팩터리 메서드로 바꾸고, 메서드 이름을 보면 차이가 명확히 드러나도록 작명 2. 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요가..
구글 클라우드 플랫폼 (Google Gloud Platform, 이하 GCP)에서 어플리케이션 에러 로그 관리 등을 쉽게 해주는 클라우드 모니터링 도구인 Stackdriver가 있습니다. 구글이 2014년도에 스택드라이버를 인수하여 2015년도 부터 GCP에 탑재하였습니다. Stackdriver의 설치부터 로깅을 전송하는 부분까지 차례대로 살펴보겠습니다. 테스트 환경은 다음과 같습니다. Google Compute Engine (Linux / Ubuntu 16.04 LTS) Java / Spring / Spring Boot Maven 1. 로깅 에이전트 설치 스택드라이버 로깅 에이전트(Stackdriver Logging Agent)는 GCP의 VM 인스턴스에 설치되어 응용프로그램으로 부터 로깅을 스트리밍 ..
Spring Security 에서 현재 인증된(로그인한) 사용자의 정보를 가져오는 방법 에 대해 살펴볼 것 입니다. 스프링의 다양한 메카니즘을 통해 현재 로그인 중인 사용자의 정보를 가져올 수 있는데, 대표적인 몇 가지를 살펴보겠습니다. 1. Bean 에서 사용자 정보 얻기 가장 간단한 방법은 전역에 선언된 SecurityContextHolder을 이용하여 가져오는 방법입니다. Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UserDetails userDetails = (UserDetails)principal; String username = principal.getUsername(); St..