java 30

[아이템07] 다 쓴 객체 참조를 해제하라

Java는 C/C++ 언어와는 달리 가비지 컬렉터가 메모리를 관리하고 있다. 하지만 Java 역시 메모리 관리에 신경을 써야 한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e){ ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackExcep..

[아이템05] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

많은 클래스가 하나 이상의 자원에 의존한다. 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현하는 모습을 많이 볼 수 있다. //정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } //싱글턴을 잘못 사용한 예 public class SpeelChecker { private final Lexicon dictionary = ...; p..

[아이템04] 인스턴스화를 막으려거든 private 생성자를 사용하라

개발을 하다 보면 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아 놓을 수 있다. //Math 메서드 public final class Math { private Math() {} public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; public static double sin(double a) { return StrictMath.sin(a); // default impl. delegates to StrictMath } ... ... ... } ..

[아이템03] private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글톤(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글톤 생성 방식 보통 두 방식을 사용하며 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 1. public static final 필드 방식 public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() {}; } 장점 해당 클래스가 싱글턴임이 API에 명확히 드러난다. 간결함 private 생성자는 Singleton.INSTANCE를 초기화할 때 딱 한 번만 호출된다. 또한 private 외 다른 생성자가..

[아이템02] 생성자에 매개변수가 많다면 빌더를 고려하라

정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts(int servingSize, int servings){ this(servingSize,servings,0); } public NutritionFacts(int servingSize, int servings, int calories){ this(servingSize,servings,calories,0); } public NutritionFacts..

[아이템01] 생성자 대신 정적 팩터리 메서드를 고려하라

클래스의 인스턴스를 얻는 전통적 수단은 public 생성자이다. 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. public 생성자 대신 정적 팩터리 메서드가 좋은 이유 5가지 첫 번째. 이름을 가질 수 있다. public class Dante { public Dante(){ //생성자 System.out.println("HI"); } public static void DanteWithMoney(){ // 정적 팩토리 메서드 System.out.println("I have money"); } public static void main(String[] args) { DanteWithMoney(); } } -> 생성자 이름이 없음 반환될 객체의 특성을 알기 힘듦 -> 정적 팩토리 메서드 이름..

[Java] Servlet(서블릿) 이란?

사용자 요구에 맞춰 동적으로 반응하는 페이지을 만들기 위해 만들어진 것이 서블릿이다. 서블릿은 JSP 표준이 나오기 전, 만들어진 표준으로 java로 웹 어플리케이션을 개발할 수 있도록 하기 위해 만들어졌다. 서블릿을 이용하면 자바 클래스를 이용해서 웹 어플리케이션을 개발하게 된다. 서블릿은 웹의 요청과 응답의 흐름을 메서드 호출을 통해 체계적으로 다룰 수 있게 해준다. 오늘 다룰 내용과 연관하여 내가 업무에서 쓰는 개발 환경은 다음과 같다. 엄청 레거시한 코드와 개발 환경 Java 1.8 Servlet 3.0(web.xml을 통한 매핑) tomcat 8.0 MVC2 구조 Spring 사용 안함 1. web.xml로 매핑하기 WEB-INF 폴더의 web.xml 파일에 서블릿 클래스로 등록한다. Hello..

Study/Java 2022.03.01

[Java] 직렬화(Serialization)

예전에 운영 배포 할 때 직렬화 문제를 마주한 적이 있었다. 서버 한 대에서는 직렬화를 구현한 객체에 새로운 변수를 추가했었는데, 다른 서버 한 대에 수정한 객체를 반영하지 않아 계속 역직렬화 에러가 발생하였다.. 요청할 때의 객체와 응답 받을 때의 객체가 다른 버전의 클래스를 갖고 있던 것이 문제였다. 직렬화에 대한 개념이 없어 에러를 찾는데 쉽지 않았다. 1. 직렬화란? 객체를 데이터 스트림으로 만드는 것을 뜻한다. 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인 데이터로 변환하는 것을 말한다. 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는것을 역직렬화(deserialization)라고 한다. 2. ObjectInputStream, ObjectOutputStream 직렬화는 ObjectOutp..

Study/Java 2021.10.25

[Spring] spring JDBC

JDBC 는 자바의 데이터 액세스 기술의 기본이 되는 로우레벨의 API다. JDBC는 표준 인터페이스를 제공하고 개발자가 이 인터페이스를 구현한 드라이버를 제공하는 방식으로 사용된다. 그 덕분에 SQL의 호환성만 유지한다면 JDBC로 개발한 코드는 DB가 변경돼도 그대로 재사용할 수 있다는 장점이 있다. 그렇다면 단점은? 간단한 SQL을 하나 실행하는 데도 복잡한 코드가 필요하다. DB에 따라 일관성 없는 정보를 가진 채로 던져지는 예외 처리를 해야하며 SQL은 코드 내에서 문자로 제공해야 한다. 스프링 JDBC 기술과 동작 원리 - 스프링의 JDBC 접근 방법 1. SimpleJdbcTemplate -> 가장 많이 사용되는 기능을 통합하였다. 방대한 템플릿 메소드와 내장된 콜백을 제공하며 jdbc의 모..

Study/Spring 2021.10.04

[Spring] RestTemplate

[1] RestTemplate란 ? - org.springframework.http.client - Spring 3.0 부터 지원 - 스프링에서 http 통신에 쓸 수 있다. - HTTP 서버와 통신을 단순화하고 RESTful 원칙을 지킨다. 그 외 스프링의 REST 서비스 호출 방법 AsyncRestTemplate Spring 4부터 사용 가능한 비동기 RestTemplate WebClient Spring 5부터 사용 가능한 Non-Blocking, Single Thread 이며 동기&비동기 둘다 지원 RestTemplate를 많이 사용하고 있지만 최근 추세는 WebClient로 마이그레이션 중인 것 같다. [2] RestTemplate의 동작 - HttpClient는 Http를 사용하여 통신하는 범용..

Study/Spring 2021.09.23