부제: Hibernate Dynamic Eager and Lazy Load. JPA eager/lazy load. JPA eager load 하기 Hibernate는 JPA의 대표주자라고 할 수 있는 ORM(Object Relational Mapping)이다. MyBatis와 같은 SQL-Mapper와 달리 개발자가 쿼리를 직접 작성하지 않는다는 특징이 있다. 그래서 생산성이 좋고 SQL을 직접 작성하지 않으니 쓸데없이 DAO를 찍어낼 필요도 없고 장점이 많지만, 이 글에서 다루지 않을 것이다. 1. Eager load 와 Lazy load Eager-load와 Lazy-load에 대해 먼저 짚고 넘어가자. 뒤따라올 두개의 모델 예제를 보면 된다. @Entity public class Student { ..
REST API 웹 서버를 개발할 때 모든 Request와 Response를(Header와 Body 전부!) 하나의 JSON Object formate에 로깅하고 싶을 때가 있다. 이번 포스팅에서는 HttpServletRequestWrapper을 활용한 Request body를 처리기법으로 로깅하는 법에 대해 다루겠다. (How to log whole request and response at once?) 얼핏 생각하면 Request 및 Response를 logging 할 때 aspect를 활용해서 로깅하면 될 것 같다. 그러나 이건 좋은 방법이 아니다. 이유는 크게 두가지인데.. 1. Request와 Response를 한번에 로깅할 수 없다.2. Request의 Stream은 중복해서 읽을 수 없다. ..
애플리케이션에서 설정에 관련된 상수는 소스코드와 별도로 관리하는 것이 기본이다. 설정과 관련된 값을 소스코드 내부에서 관리하면.. 값이 바뀔 때마다 매번 컴파일을 해야해서 번거롭기 때문이다. Spring Boot는 프로젝트 설정에 쓰이는 내용 또는 각종 상수를 .yml 이나 .properties 파일에 저장할 수 있게 지원한다. 이번 포스팅에서는 .properties의 상수를 Enum에 초기화 하는 법을 간단히 알아보겠다. Spring Boot에서 .properties 파일의 값을 가져올 때는 @Value 라는 어노테이션을 쓴다. 이것을 쓰면 Bean 객체가 초기화 될때 @Value에 지정된 값을 해당 프로퍼티에 초기화 한다. setter를 활용해서 초기화를 하는 것도 가능하다. 아래의 간단한 예제를 보..
클래스 설계할 때마다 제네릭 문법을 항상 까먹는다. 제네릭을 직접 사용할 일은 많지 않을 수 있다. 하지만 각종 라이브러리들에서 자주 쓰이므로 꼭 알아두는 것이 좋다. 그래서 정리해보는 제네릭 문법 포스팅. 사진출처: https://www.nisdon.com/2017/09/java-parametric-polymorphism-generics-udemy-course.html 제네릭(Generic)은 코드블럭 내부에서 쓸 자료형을 외부에서 지정하는 기법을 뜻한다. 여러가지 자료형을 허용하고 싶을 때 Object로 선언해버리면 깔끔하지만, 그렇게하면 원하지 않는 자료형이 입력되었을 때의 오류를 컴파일 시점에 잡아낼 수 없다. 1. Generic Class 클래스 내부에서 사용될 자료형을 지정하는 것이다. 대표적..
1. 빌더 패턴이란? 빌더 패턴(Builder Pattern)은 추상 팩토리 패턴(Abstract Factory Pattern)과 팩토리 메소드 패턴(Factory Method Pattern)과 함께 객체의 생성과 관련된 디자인 패턴이다. 빌더 패턴은 생성자에 들어갈 매개 변수에 대해 차례차례 매개 변수를 받아들이고 모든 매개 변수를 받은 뒤에 객체를 생성하는 구조이다. 그래서 매개 변수가 많을 때 쓰면 유리하다. 이렇게 글로 설명하면 명확하지 않으니 아래에 예를 들어 설명할 것이다. 2. 빌더 패턴을 왜 쓰는가? 빌더 패턴을 설명하기 위해 '학생 정보'를 저장하는 클래스를 소개한다. public class StudentInfo { private String firstName; private String..
JAVA는 C와 달리 개발자가 명시적으로 메모리를 건드리지(참조하지) 않는다. JAVA는 메모리를 Garbage Collection이라는 알고리즘으로 관리하며, 개발자가 메모리를 관리할 필요가 없도록 한다. (직접 관리하면 오히려 더 안좋은 경우가 많다.) Garbage Collection은 말 그대로 '쓰레기를 정리하는 작업'이다. 그리고 JAVA의 메모리 입장에서 '쓰레기'는 곧 객체, 다시 말해서 '필요 없는 객체'이다. 1. GC와 Heap Garbage Collection을 본격적으로 알아보기전에 JVM의 Runtime Area를 떠올려보자(생각이 안나거나, 잘 모르는 사람은 여기를 참고하자.) Runtime Area의 영역들은 스레드가 시작할 때 생성되는 경우가 있는가 하면, JVM이 시작할 ..
부제: Checked Exception Unchecked Exception 비교 프로그램은 항상 개발자가 의도한대로 동작하지 않는다. 이것들을 오류(Error)나 버그(Bug)로 자주 일컫는다. JAVA에서는 '오류'를 다루기 위해 Throwable 이라는 클래스를 활용한다. Oracle은 Throwable에 대해 아래와 같이 소개했다. The Throwable class is the superclass of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can ..
객체 중에는 시스템 전체에 딱 하나만 존재해야 유리한 것들이 있다. 대표적으로 스레드 풀이나 캐시, 각종 설정정보 등이 있다. 이들의 인스턴스가 두 개 이상 존재하게 되면 시스템에 좋지 않은 영향을 끼친다. (작게는 자원낭비, 크게는 프로그램 오류) 객체(인스턴스)를 시스템 전체에 딱 하나 존재하도록 처리하기 위해 전역변수를 사용해도 되지만, 전역변수는 원하는 때에 생성할 수 없다는 단점이 있다. 그래서 사용하는 것이 싱글턴패턴(Singleton Pattern)이다. 싱글턴 패턴을 어떻게 구현하는지 지금부터 '자세히' 알아보자. 먼저, 싱글턴패턴은 시스템 전체에 딱 하나만 존재하게 하기 위해 생성자를 아무나 접근할 수 없게 막고, 스스로 인스턴스를 관리한다. 아래 코드를 보면 명확해 질 것이다. publ..
★관련 링크Spring과 DB이야기 - 1. DataSource와 JdbcTemplateSpring과 DB이야기 - 2. JdbcTemplate에서의 UPDATE, INSERT 데이터베이스 트랜잭션(Database Transaction)은 데이터베이스에서 상호작용의 단위라고 할 수 있다. 연관된 두 개 이상의 쿼리를 실행할 때, 모든 작업이 끝났을 때 COMMIT을 수행하고 중간에 오류가 발생하면 ROLLBACK하는 것이 기본이다. (트랜잭션을 잘 모른다면 여기를 클릭) 트랜잭션을 JAVA에서 구현한다면 아래와 같을 것이다. Connection conn = null; try { conn = DriverManager.getConnection(jdbcUrl, user, pw); conn.setAutoComm..
★관련 링크Spring과 DB이야기 - 1. DataSource와 JdbcTemplateSpring과 DB이야기 - 3. Transaction 처리 지난 포스팅에서 DataSource의 개념과 Spring에서 DataSource를 활용한 JdbcTemplate으로 간단한 SELECT 쿼리를 작성해봤다. 이번 포스팅에서는 UPDATE와 INSERT에 대해 짚어보겠다. JdbcTemplate을 활용하여 INSERT, UPDATE, DELETE 쿼리를 실행할 때는, update() 메소드를 사용하면 된다. update() 메소드는 아래와 같다. - int update(String sql) - int update(String sql, Object... args) int 형태의 리턴을 하는데, 쿼리 실행 결과로 ..