JPA에서 중요한 두 가지 - ORM - 영속성 컨텍스트(Persistence Context) 영속성 컨텍스트 - JPA를 이해하는 데 가장 중요한 용어 - "엔티티를 영구 저장하는 환경" - 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념 - EntityManager를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 - 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태 - 영속(managed) : 영속성 컨텍스트에 관리되는 상태 - 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(removed) : 삭제된 상태 비영속 - 객체를 생성한 상태 Member member = new Member(); member.setId("member1")..
SQL 중심적인 개발의 문제점 - 무한 반복, 지루한 코드 (CRUD) - SQL에 의존적인 개발을 피하기 어렵다 패러다임의 불일치 객체 지향(OOP) vs 관계형 데이터베이스(RDB) 개발자가 SQL 매퍼(Mapper)를 통해 객체를 RDB에 저장한다. 객체와 관계형 데이터베이스의 차이 1. 상속 - 객체는 상속을 지원하지만, RDB는 지원하지 않는다(유사한 것 있음) 2. 연관관계 - 객체는 참조를 사용하지만, RDB는 외래 키를 사용한다. 3. 데이터 타입 4. 데이터 식별 방법 객체 그래프 탐색 - 객체는 연관된 것끼리 자유롭게 객체 그래프를 탐색할 수 있어야 한다. 엔티티 신뢰 문제 - 계층형 아키텍처(Layered Architecture)에서 엔티티는 신뢰할 필요가 있다. 모든 객체를 미리 로..
퀵 정렬(Quick Sort): 랜덤화에 의한 정렬 정렬을 하려는 n개의 원소들로부터 랜덤 원소 p를 피벗(pivot)으로 선택 퀵 정렬은 피벗 p를 제외한 n - 1개의 원소들을 두 부분으로 분리: - 왼쪽 부분에는 정렬된 순서에서 p보다 먼저 나오는 원소 - 오른쪽 부분에는 정렬된 순서에서 p보다 나중에 나오는 원소 피벗 p는 정렬이 끝난 순서에서 위치하여야 할 배열의 자리에 머무르게 된다. 분할된 후 한쪽 편에 있는 어떠한 원소도 마지막 정렬된 순서에서 다른 쪽으로 옮겨지지 않는다 -> 피벗의 양쪽으로 나뉘어져 있는 원소들은 서로 독립적으로 정렬 가능 (재귀 알고리즘 표현 가능) quick_sort(item_type s[], int l, int h) { int p; if ((h - 1) > 0) {..
스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다 (싱글톤 스코프) 스프링의 다양한 스코프 - 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 - 프로토타입 : 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않고 매우 짧은 범위의 스코프 - 웹 관련 스코프 request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프 session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프 application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프 프로토타입 스코프 싱글톤 빈 요청 1. 싱글톤 스코프의 빈을 스프링 컨테이너에 요청 2. 스프링 컨테이너는 본인이 관리하는 스프링 빈..
정렬을 주목해야 하는 이유 - 정렬은 알고리즘을 설계하는 데에 있어서 기본적인 구성요소(Building Block) 역할을 한다. - 분할-정복, 자료구조 등과 같은 알고리즘 설계에 사용되는 흥미 있는 아이디어들이 정렬의 과정에서 나타난다. - 역사적으로 컴퓨터는 다른 어떤 것보다도 정렬에 많은 시간을 할애하였다. 정렬의 응용 - 탐색 : 모든 값들이 정렬된 경우 이진 탐색을 사용하면 O(logN) 시간에 검사할 수 있다. - 최근접쌍(Closest Pair) : N개의 숫자가 주어질 경우, 차이가 가장 작은 두 수를 어떻게 찾을까? 정렬을 사용하면 O(NlogN)의 시간을 가진다. - 원소 유일성 - 도수 분포 : N개의 원소가 주어졌을 때 어떤 원소가 가장 많은 빈도로 나타내는가? 원소들이 정렬되어 ..
빈 생명주기 콜백 DB 커넥션 풀이나, 네트워크 소켓같은 경우 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하려면 객체의 초기화와 종료 작업 필요 public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); connect(); call("초기화 연결 메시지"); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("connect: " + url); } public v..
/** 자료구조는 따로 다시 정리할 예정**/ 이진 탐색 트리(Binary Search Tree) 이진 탐색을 이용하기 위해서는 두 원소에 대한 빠른 접근 필요 루트 있는 이진 트리의 재귀적 정의 1. 아무것도 없음 2. 루트로 불리는 한 노드와 왼쪽 서브트리와 오른쪽 서브트리로 구성 이진 탐색 트리에서는 이진트리의 각 노드에 하나의 키의 라벨이 있다. 어떤 노드의 값이 x이면, - 왼쪽 서브트리에 있는 모든 노드들의 값은 x보다 작다. - 오른쪽 서브트리에 있는 모든 노드들의 값은 x보다 크다. 이진 탐색 트리의 구현 typedef struct tree { item_type item; struct tree *root; struct tree *left; struct tree *right; } 트리에서의 ..
의존관계 주입에는 크게 4가지 방법이 있다. - 생성자 주입 - 수정자(setter) 주입 - 필드 주입 - 일반 메서드 주입 생성자 주입 - 생성자를 통해서 주입하는 방법 - 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다 - 불변, 필수 의존관계에 사용 - 생성자가 딱 1개 있으면 @Autowired 생략 가능 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired // 생략 가능하다. public OrderServiceImpl(MemberRepo..
- 스프링 빈 등록은 @Bean 또는 을 통해서 설정 정보에 직접 빈 등록 - 스프링 빈이 엄청 많아지면? 많은 문제 발생(누락, 정보 커짐, 등록 귀찮) - 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 지능 제공 @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { } - AutoAppConfig.java에 @ComponentScan은 자동으로 컴포넌트 스캔을 해서 빈 등록을 해준다. - 기존의 AppConfig.java와 달리 @Bean으로 등록한 클래스가 없다 -..
웹 애플리케이션과 싱글톤 - 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. - 웹 애플리케이션은 보통 여러 고객이 동시에 요청 - 스프링 없는 순수한 DI 컨테이너로 테스트해보면 memberService에 대한 객체가 각각 다르다는 것을 확인할 수 있다. - 요청할 때마다 AppConfig는 객체를 생성하고 메모리 낭비가 심해지는 문제를 야기한다. 싱글톤 패턴 - 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 - 객체 인스턴스 2개 이상 생성하지 못하게 한다 - private 생성자를 이용해서 외부에서 new 키워드를 사용하지 못하도록 한다. public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private stat..