이것저것 Spring

Spring Transaction 은 method 단위로 동작 한다. 이것은 Method 시작 시점에 DB Connection 객체를 얻고 Method 종료 시점에 commit 후 DB Connection 을 반납한다는 것을 의미한다.

출처: http://javafactory.tistory.com/1404 [FreeLife의 저장소]

1-3장 JPA

비교
동일성 비교(==) - 객체 인스턴스의 주소 값을 비교한다.
동등성 비교(equals()) - 객체 내부의 값을 비교한다.

트랜잭션: jpa 실행문을 말한다
하이버네이트: ORM 프레임워크
JPA: 자바 ORM 기술에 대한 API 표준 명세다.
현재 JPA 를 구현한 ORM 프레임워크는 하이버네이트, EclipseLink, DataNucleus가 있는데 하이버네이트가 가장 대중적이다.

- JPA 패러다임의 불일치를 해결해준다.
상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 문제를 해결해준다.
- 성능
select
select
JPA는 한 번만 데이터베이스에 전달하고 두 번째는 조회한 회원 객체를 재사용한다.
힌트 제공

JPA는 통계 쿼리같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어있다.
상황에 따라 다르지만 정말 복잡한 통계 쿼리는 SQL을 직접 작성하는 것이 더 쉬운 경우가 많다.
해서, JPA가 제공하는 네이티브 SQL을 사용하거나
마이바티스, JdbcTemplate과 같은 SQL 매퍼 형태의 프레임워크를 혼용하는 것도 좋은 방법.

객체와 관계형 데이터베이스 매핑
핵심개념은 영속성 컨텍스트

org.h2.Driver
jdbc:h2:tcp://localhost/~/test
sa

하이버네이트 속성
hibernate.dialect: 데이터베이스 방언
SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언이라 한다.

- 엔티티 매니저 팩토리
JPA 를 사용할 수 있게 준비한다.(기반 객체 생성, 커넥션풀 생성)
애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
- 엔티티 매니저
JPA 대부분의 기능 제공
엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안 된다.
- 종료
엔티티매니저 종료 반드시
엔티티매니저 팩토리 반드시

트랜잭션은 try catch{ tx.rollback(); } 처리

수정
JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 갖추고 있다.
따라서 member.setName("nnnn"); 변경과 동시에 UPDATE SQL 을 생성해서 값을 변경한다.

JPQL
필요한 데이터만 불러오려면 검색조건이 포함된 SQL을 사용해야 한다.
SQL 과의 차이점
JPQL- 엔티티 객체를 대상으로 쿼리한다. 클래스와 필드를 대상으로 쿼리한다.
SQL - 데이터베이스 테이블을 대상으로 쿼리한다.

JPQL은 대소문자를 명확하게 구분한다.

** 영속성 관리 **
엔티티매니저팩토리 생성시 persistence-unit 이름을 가져온다.(많은 비용)
엔티티매니저 생성 (적은 비용)

- 영속성 컨텍스트(엔티티를 영구 저장하는 환경)
애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스
저장하거나 조회하면 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
em.persist(member);
*** persist() 메소드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다.

엔티티 생명주기
상태
 ㄴ 비영속: 객체를 생성한 상태
 ㄴ 영속: .persist(), .find(), JPQL 영속성 컨텍스트에 의해 관리된다.
 ㄴ 준영속: .detach(), .close(), .clear() 분리
 ㄴ 삭제: .remove()

영속성 컨텍스트의 특징
@Id로 구분한다. 영속상태는 식별자 값이 반드시 있어야 한다.
commit하는 순간 저장하는데 이를 flush라 한다.

.persist() //1차 캐시에 저장됨.
find() 1차 캐시에서 조회한다. 없다면 데이터베이스를 조회한다.
데이터베이스에 조회해서 엔티티를 생성한다. 그리고 1차에 저장한 후 영속 산태의 엔티티를 반환한다.
바로 불러오게되므로 성능상 이점을 누릴 수 있다.

트랜잭션 커밋
flush() 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업
쓰기 지연 SQL 저장소에 모인 등록, 수정, 삭제쿼리를 DB 반영한다.
한번에 보내므로 성능 최적화

변경감지
JPA는 엔티티를 영속성에 보관할 때 최초 상태를 저장한다 -> 스냅샷
플러시 시점에서 스냅샵과 엔티티를 비교 후 변경된 엔티티를 찾는다.
모든 필드 update 의미라 재사용의 장점은 있지만
필드가 많거나(30개 이상) 저장되는 내용이 너무 크면 수정된 데이터만 사용해서 동적으로 UPDATE SQL 생성
@org.hibernate.annotation.DynamicUpdate
(@DynamicInsert - null 아닌 필드만 동적 생성)

플러시(변경내용 동기화!!)
.flush() - 거의 사용하지 않는다.
트랜잭션 커밋 시 자동 호출
JPQL(createQuery) 실행 시 자동 호출
.find() 플러시 실행되지 않는다.

준영속 상태
.detach() 스냅샷의 상태로 초기화? 수정되려던 변경, 쿼리 정보를 지운다.

초기화 상태
.clear() 

종료
.close() 영속상태를 다시 준영속 상태로 만들어준다.

준영속 병합
.merge() 준영속 상태의 엔티티를 영속 변경해준다. (변경은 아니고 영속 상태의 새로운 엔티티가 반환된다.)
*** 병합은 준영속, 비영속을 신경쓰지 않는다. 식별자로 엔티티를 조회후 save or update 기능을 수행한다.

3장//
====================================================================================




객체지향 2 java_start

클래스간 상속관계를 적절히 맺어 주는 것이 객체지향 프로그래밍에서 가장 중요한 부분이다.

상속관계 - ~은 ~이다 (Extends)
포함관계 - ~은 ~을 가지고 있다.

*오버로딩 vs 오버라이딩
오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 - 상속받은 메서드의 내용을 변경하는 것

오버라이딩은 조상의 메서드보다 넓은 범위의 접근 지정해야 한다.

조상 클래스를 상속받은 경우 자신의 멤버이므로 this를 사용할 수 있다.
단, 이름이 같은 객체인 경우 자신의 멤버는 this, 상속받은 멤버는 super 로 구분할 수 있다.

Abstract (미완성 설계도)
추상클래스로부터 상속을 받는다면 오버라이딩을 통해 모든 추상메서드를 구현해야한다.
추상메서드를 하나라고 구현하지 않는다면, 자손 클래스 역시 추상클래스로 지정해주어야 한다.
자손이 추상메서드를 재정의하기 때문에 조상의 추상메서드의 body는 비워진다.
인스턴스를 생성할 수 없다.

Interface (기본 설계도)
추상클래스보다 추상화 정도가 높다.
모든 멤버변수는 public static final이며, 생략가능
모든 메서드는 public abstract이며, 생략가능
인스턴스를 생성할 수 없다.

인터페이스는 여러 상속이 가능하다.







객체지향 1 java_start

클래스와 객체
클래스는 객체를 정의하고 생성하는데 사용된다.

객체와 인스턴스
객체는 모든 인스턴스를 포함하는 포괄적인 의미를 갖고있다. 
객체는 속성(멤버 변수)과 기능(메서드), 두 종류의 구성요소로 이루어져 있다. (= 맴버)
static 변수 ( 클래스 변수)는 하나의 저장공간을 공유하므로 항상 공통된 값을 사용할 수 있다.

메서드
하나의 기능만 정의하는게 좋다.

return 문은 결과를 저장한 뒤 마지막에 한번만 사용하는게 좋다.

(int t) //기본형 매개변수
(Date a) //참조형 매개변수

클래스메서드와 인스턴스메서드
클래스내에 선언된 변수는 클래스변수(static), 인스턴스 변수가 있다.
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공동적으로 사용해야하는 것에 static을 붙인다.
2. 클래스변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

static 메서드는 인스턴스메서드를 호출할 수 없다.
호출하기 위해선 생성 후 호출할 수 있다.












클래스멤버는 언제나 참조 또는 호출이 가능하기 때문에 인스턴스멤버가 클래스 멤버를 사용하는 것은 아무런 문제가 안된다.

오버로딩
하나의 이름인 메서드에 다양한 타입의 매개변수를 구현.
ex) System.out.println(String n);

생성자
인스턴스 초기화 메서드. return 값이 없다.
(연산자 new 가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다.)
Card c = new Card();
연산자 new에 의해 메모리 (heap)에 Card 클래스 인스턴스가 생성된다.
생성자 Card()가 호출되어 수행된다.
연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

기본생성자
기본생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
this - 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

** 생성자를 이용한 인스턴스 복사 

















인스턴스 변수는 지역변수와 달리 초기화없이 바로 사용이 가능

초기화블럭
순서는
1 클래스 초기화블럭 ( 메모리 로딩될 때 한번만 실행됨)
2 인스턴스 초기화 블럭 ( BlockTest 인스턴스가 생성될 때마다 제일 처음으로)


Elasticsearch Log Stash Kibana ELK 공부하기 JAVA


1 2 3 4 5 6 7 8 9 10 다음