DB에서 데이터를 조회하는 것은 애플리케이션 서버 안에서 실행되는 메서드 보다 비교도 안될 정도로 시간 비용이 많이 든다. 그래서 DB에서 데이터를 조회하는 것을 최소화하는 것이 성능 최적화의 중요 요점이라고 볼 수 있다. JPA 동작원리 애플리케이션 내에서 EntityManager는 EntityManagerFactory 객체에서 만들어지는데 EntityManagerFactory객체는 한개만 있고 EntityManager는 여러개 만들어 낸다. EntityManager는 한개의 트랜잭션을 가질 수 있다. EntityManager가 관리하는 트랜잭션 내에서 애플리케이션 성능을 높이기 위해 영속성 컨텍스트라는 개념이 나온다. 영속성 컨텍스트란 JPA 내부 동작 방식을 이해하려면 영속성 컨텍스트를 이해해야 하..
@Entity 사용 유의사항 1. @Entity를 매핑해서 사용할 클래스는 기본생성자는 필수다(public 또는 protected 생성자) JPA 구현체들은 클래스의 인스턴스를 생성할 때 기본 생성자를 필요로 한다. 기본 생성자가 없으면 JPA 구현체가 클래스의 인스턴스를 생성할 수 없다. 또한 JPA는 성능 최적화를 위해 프록시 패턴을 사용하는데 프록시 객체를 생성하는데 기본 생성자가 필요하다. 2. Final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. Final 클래스는 상속이 안되므로 프록시 객체를 생성하지 못한다. 3. DB에 저장할 필드에 final을 사용하면 안된다. JPA는 엔티티를 영속성 컨텍스트에서 관리하고 데이터베이스와 상호 작용할 때 필드의 값을 ..
버전및 세팅 Springboot 3.0.2 DB: embadded H2 자바: 17 plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } UUID 적용 사유 아래 처럼 id를 Long 타입으로 주고 글이 하나 생길때마다 하나씩 늘어나는 방식으로 줬다면 글이 총 몇개있는지 파악할 수 있다. 전체 개수가 몇개인지 파악되는 것을 꺼려할수도 있기 때문에 id를 암호화 하거나 UUID로 변경해야 한다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatabl..
Stream은 Java8에서 처음 도입 되었으며, stream은 연속된 데이터들을 처리할 수 있는 기능의 모음이다. stream 작업은 아래 그림과 같이 stream 파이프라인(pipeline)으로 구성되는데 1개의 소스(Array, Collection 등)과 0개이상의 중간 작업과 마지막 1개의 종료 작업으로 끝이 난다. Strem 특징 1. 스트림 소스 생성 종료 작업은 1개만, 중간연산은 여러개 가능하다. 스트림 소스 생성과 종료 작업은 1개만 있을수 있어서 중간 작업과 같이 여러개 있을 수 없다. 만약 한개의 스트림 파이프라인에서 종료 작업을 여러번 하면 에러가 난다. 그리고 중간 작업을 여러번 한다고 해서 원본 소스 데이터를 변경하지 않는다. 2. 지연 연산(LAZY Evaluation) 또한 ..
제네릭스 사용 이유 제네릭스를 알려면 우선 타입변수를 알아야 한다. 타입변수는 일반적으로 제네릭스를 사용하는 ArrayList, Set 등 컬렉션에서 볼 수 있는데, 아래 보이는 가 타입 변수다. 제네릭스를 사용하지 않으면 모든 형태의 데이터를 담을수 있게 Object로 되어 있어야 하고 데이터를 사용하려면 Object의 데이터를 꺼내서 형변환이 필요하고, 또 다른 타입의 데이터를 넣었을때 형변환해서 사용하기 전까지 알수가 없다. List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); 하지만 제네릭스를 사용하면 형변환 할필요가 없고, 데이터를 add 하는 시점에서 데이터 타입이 String이 아니라면 에러가 난다. ..
스프링을 이해하는데 POJO(Plain Old Java Object)를 기반으로 스프링 삼격형이라는 애칭을 가진 IoC/DI, AOP, PSA라고 하는 스프링 3대 프로그래밍 모델에 대한 이해가 필수다. IoC/DI 이해와 전략 패턴 IoC(Inversion of Control)는 제어의 역전 DI(Dependency Injection) 의존성 주입 이라고 한다. 의존 관계라는 것은 프로그래밍에서 new 객체 생성을 뜻한다. 아래 소스를 보면 Car 클래스에서 생성자를 통해 tire 객체를 new 로 생성해서 필드에 주입한다. 이 과정에서 Car 클래스는 Tire 클래스에 의존한다 라는 뜻이 된다. public class Car { Tire tire; public Car() { tire = new Kor..
OCP - 개방 폐쇄 원칙 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. by 로버트 C. 마틴 위 말을 의역하면 "자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다" 이렇게 된다. 말만 들으면 이해하기 어렵지만 이 원칙을 지킨 디자인 패턴중 대표적으로 어댑터 패턴이 있다. 즉 어댑터 패턴을 이해하면 OCP를 이해할 수 있다. 어댑터 패턴(Adapter Pattern) 어댑터를 번역하면 변환기(converter)라고 할 수 있다. 대표적으로 110V 인터페이스를 -> 220V 인터페이스로 변환해준 어댑터를 생각하면 쉽다. 위 처럼 서로 다른 두개의 인터페이스가 연결이 가능하게끔 해주는 것이고, 이것을 프로그래밍화 ..
SOLID 원칙 객체지향 설계 OOD(Object Oriented Design)의 정수라고 할 수 있는 5원칙이 집대성 됐는데 바로 이것이 SOLID 이다. SOLID는 아래 5가지 원칙의 앞 머리 알파벳을 따서 부르는 이름이다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Principle): 개방 폐쇄 원칙 LSP(Liskov Substitution Principle): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 위 원칙들은 응집도(High Cohesion)는 높이고, 결합도(Loose ..
함수를 통해서 코드를 논리적인 단위로 나누어 블록화가 가능하여 프로그래밍이 편해지고 더욱 더 파격적으로 객체지향을 위한 클래스가 나왔다. 객체지향은 인간의 인지 및 사고 방식까지 프로그래밍에 접목하는 인간 지향을 실천하고 있다.아래는 객체지향의 4대 특성중 추상화와 상속을 정리한 글이다.추상화추상화는 구체적인 것을 분해해서 관찰자가 관심 영역에 있는 특성만 가지고 재조합 하는것 이다. 이것을 모델링이라고 한다. 모델은 실제 사물을 정확히 복제하는게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것이다. 관심 영역에 있는 특성을 애플리케이션 경계(Application Boundary) 라고 한다. 즉 추상화는 애플리케이션 경계 내에서 관심 있는 특성들만 추출한 클래스이다. 사람이란 클래스를 모델..
자바에서 상속을 이용하면 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과 때문에 유지보수 측면에서 효율성을 높일 수 있다. 그래서 객체지향 프로그래밍 특징 중에 상속이 포함되는 것이다. [상속 특징] 1. 현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다. 2. 현실에서도 부모를 여러명 가질수 없듯이, 프로그램에서도 단 하나의 부모만 가질 수 있다. 3. 부모 클래스가 private나 다른 패키지에 있고 default 접근 제한자를 가지고 있으면 상속을 할 수 없다. [자식클래스가 부모클래스를 사용할 수 있는 이유] 상속을 받은 자식 클래스의 객체가 생성되면 부모 객체가 먼저 생성되는데 그 이유는 자식 클래스의 기본 생성자에 있는 super() 함수로 부..
[final 필드] final 필드는 초기값이 정해진 이후 수정할수 없는 데이터라는 뜻이다. final 필드에 초기값을 줄 수 있는 방법은 2가지이다. 1. 필드 선언 시에 주는 법 2. 생성자에서 주는 법 만약에 위 2가지 방법으로 초기화를 안하면 아래처럼 에러가 발생한다. [final 클래스] 클래스에 final이 붙으면 상속을 허락하지 않겠다는 의미다. public final class 고양이 { } [final 메서드] 메서드가 final이면 오버라이딩을 금지하게 된다. [상수 설명과 특징] 상수는 한번 정하면 바꿀수 없어서, 불변의 값이라고 한다. 예를들어 원주율 이런것인데 자바에서 상수는 static final 이라고 부른다. 자바에서 final 필드는 한 번 초기화 되면 수정할 수 없는 필드..
싱글톤(Singleton)은 단 하나의 객체만 만들도록 보장하는데 대표적인 디자인 패턴중에 하나이다. 싱글톤을 디자인 패턴을 이해하려면 클래스 정적 멤버와 인스턴스 멤버의 메모리 사용 영역을 이해 해야 한다. [싱글톤 클래스 생성 단계] 1. 싱글톤은 만들려면 우선 외부에서 생성자를 호출 할 수 없어야 한다. 클래스 로더 시점에서 생성자를 통해 자동적으로 객체하나가 생성되고 그 후에는 생성되지 않게 하기 위함이다. 그래서 생성자 앞에 private를 붙여준다. 2. 정적 필드를 만드는데 이것도 다른 클래스에서 사용될수 없도록 private를 붙여주고 클래스로더 시점에 만들어지고 초기화 되어야 하기 때문에 정적 필드 만든다. 3. 마지막으로 만들어진 인스턴스를 가져오는 getInstance() 함수를 만들..