Life Developer
인생 개발자
분류 전체보기 (141)
[JPA]스키마 자동생성

<property name="hibernate.hbm2ddl.auto" value="create" />

 

persistence.xml 에 추가하면 @Entity를 붙어있으면 자동 스키마 생성해준다.

 

진짜 대단한놈이네 JPA ㅡㅡ  실화냐이거

 

create말고 creat-drop 하면 마지막에 테이블 날림

 

update를 쓰면 drop table 없이 그냥 alter가 된다. (테이블 수정이 됨)

 

validate 는 entity와 테이블이 정상매핑이 되었나 확인해줌

 

none은 주석이나 마찬가지임. 기능 off 시키는것. (사실 아무문자넣어도 off됨)

 

 

주의할 점

운영장비에는 절대로 create, create-drop, update 사용하면 안된다.

개발 초기에는 create 또는 update

테스트 서버는 update 또는 validate (create 하면 테이블 내용 다날라감)

스테이징과 운영서버는 validate 또는 none

 

운영할땐 걍 사용하지말자. 까딱하면 짤린다.

'Developer' 카테고리의 다른 글

[JPA]identity전략 특성  (0) 2020.09.18
[JPA]DDL 생성기능  (0) 2020.09.16
[JPA]Entity  (0) 2020.09.16
[JPA]영속성과 준영속성 관리, flush  (0) 2020.09.16
[JPA]persist와 1차캐쉬  (0) 2020.09.16
  Comments,     Trackbacks
[JPA]Entity

@Entity 가 붙은 클래스는 JPA가 관리함

JPA 는 @Entity가 필수

 

기본 생성자 필수임.

final, enum, interface, inner 클래스는 @Entity 사용 불가능

 

@Entity(name = "Member") - 기본은 클래스명

public class .......

 

@Table(name="MBR") - MBR이라는 테이블과 매핑함. inset into MBR ...

public class .......

 

 

'Developer' 카테고리의 다른 글

[JPA]DDL 생성기능  (0) 2020.09.16
[JPA]스키마 자동생성  (0) 2020.09.16
[JPA]영속성과 준영속성 관리, flush  (0) 2020.09.16
[JPA]persist와 1차캐쉬  (0) 2020.09.16
[JPA]find, em.createQuery  (0) 2020.09.16
  Comments,     Trackbacks
[JPA]영속성과 준영속성 관리, flush

flush 자동호출 - commit 할때, query 나갈때, flush 할때

 

find를 하면 1차캐쉬에 저장된다.

찾은 멤버를 setName하면 바로 update된다.

em.persist(member)를 할 필요가 없다.

 

Member member = em.find(Member.class, 150L); //1차캐쉬에 저장.
// 스냅샷도 저장됨(최초상태)
member.setName("ZZZZZ"); //찾아온 다음 변경하면 수정 끝.
// em.persist(member);//할필요 없다. 자바 컬렉션 다루듯이 써라.
System.out.println(" ================ ");

 

멤버를 하나 만들고 영속한다.(persist)한다.

em.flush()를 해서 db로 쿼리를 바로 날린다.

커밋은 안되며, 1차캐쉬도 남아있다.

Member member = new Member(200L,"member200");
em.persist(member);

em.flush(); //이 시점에 쿼리가 db에 바로 날라간다. 근데 커밋은안됨
// 1차캐쉬도 남아있다.

 

멤버를 찾는다아 업데이트한다. (찾으면 일단 1차캐쉬에 남아있음)

em.detach(member)를 하여 영속을 없앤다. (1개 가능)

clear는 모든 영속을 없애는것이다. (해당 entityManager가 관리하는것만)


Member member = em.find(Member.class,150L);
member.setName("AAAAA");
em.detach(member);
// em.clear();


Member member1 = em.find(Member.class,150L);
em.clear();
Member member2 = em.find(Member.class,150L);

 

em.close()를 하여 그냥 닫아버림.

후 작업을 할수 없다.


Member member1 = em.find(Member.class,150L);
em.close();
Member member2 = em.find(Member.class,150L);
Member member3 = em.find(Member.class,150L);

'Developer' 카테고리의 다른 글

[JPA]스키마 자동생성  (0) 2020.09.16
[JPA]Entity  (0) 2020.09.16
[JPA]persist와 1차캐쉬  (0) 2020.09.16
[JPA]find, em.createQuery  (0) 2020.09.16
[JPA]첫걸음  (0) 2020.09.16
  Comments,     Trackbacks
[JPA]persist와 1차캐쉬

멤버를 만든다.

 

Member member = new Member();
member.setId(101L);
member.setName("HelloJPA");

 

 

persist를 하면 DB에 바로 저장은 안된다.

영속성 컨텍스트에 저장된다.(commit)해야 db에 전달됨.

아래코드는 AFTER 이후 commit할때 쿼리가 전달되는것이다.


//영속
System.out.println("===BEFORE===");
em.persist(member); //이때 DB에 저장되는것이 아님
System.out.println("===AFTER===");

 

 

find로 멤버를 찾는다. 101L은 PK이다.


Member findMember = em.find(Member.class,101L);

System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " +

 

 

101L이란 PK를 가진 멤버를 2개 만든다.

1은 1차캐쉬에 저장된다.

2를 생성할때 1차캐쉬를 사용한다.

그러므로 둘은 동일하다. 쌍둥이가 아니라 그냥 자기자신임.


Member findMember1 = em.find(Member.class, 101L);
Member findMember2 = em.find(Member.class, 101L); //1차캐시부터 뒤짐.
//일반적으로 1차캐쉬가 크게 도움을 주지 않음

System.out.println("compare 1,2 = "+(findMember1==findMember2));
//1차 캐시때문에 true가 나온다. 엔티티 동일성 보장

'Developer' 카테고리의 다른 글

[JPA]Entity  (0) 2020.09.16
[JPA]영속성과 준영속성 관리, flush  (0) 2020.09.16
[JPA]find, em.createQuery  (0) 2020.09.16
[JPA]첫걸음  (0) 2020.09.16
Controller와 RestController 차이  (0) 2020.09.09
  Comments,     Trackbacks
[JPA]find, em.createQuery

find로 멤버를 찾는다. 파라미터는 클래스와 PK이다.

remove하면 바로 제거된다.

persist하면 집어넣는다. (영속성 컨텍스트에)

딴 작업 없이 setName을 하면 바로 업데이트가 된다. (커밋 안하면 결국 말짱 꽝)

 

Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
//em.persist(member);
findMember.setName("HelloJPA");

em.createQuery로 리스트를 뽑는다. (핵심은 객체에 별명짓고 그 객체를 select한다.


List<Member> result = em.createQuery("select m from Member as m",Member.class).getResultList();

for(Member member : result){
System.out.println("member.getId() = " + member.getId());
System.out.println("member.getName() = " + member.getName());
}

  Comments,     Trackbacks
[JPA]첫걸음

EntityManagerFactory를 만든다. - Persistence.createEntityManagerFactory("hello");

Factory로 entityManager를 만든다. - factory.createEntityManager();

manager로 트랜잭션을 하나 얻는다. - manager.getTransaction();

트랜잭션을 시작한다. - transaction.begin();

작업을 수행함. - 수행할때는 Manager가 함. - manager.persist(member); 등

트랜잭션이 커밋한다. - transaction.commit();

트랜잭션을 닫아준다. - transaction.close();

매니져를 종료한다. - manager.close();

Factory를 닫는다. - factory.close();

 

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
em.close();
}
emf.close();
}
}

  Comments,     Trackbacks
Controller와 RestController 차이

[ Controller - View ]

 

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.

  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.

  3. Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServlet은 View를 사용자에게 반환한다.

 

[ Controller - Data ]

하지만 Spring MVC의 컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다. 이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.

 

 

 

 

[ RestController ]  - Controller + ResponseBody

@RestController는 Spring MVC Controller에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다.

 

'Developer' 카테고리의 다른 글

[JPA]find, em.createQuery  (0) 2020.09.16
[JPA]첫걸음  (0) 2020.09.16
자바스크립트 TDZ (Temporal Dead Zone) 임시사망지역  (0) 2020.09.04
javascript curry함수, 커링이란?  (0) 2020.08.05
Spring JDBC란?  (0) 2020.08.03
  Comments,     Trackbacks
자바스크립트 TDZ (Temporal Dead Zone) 임시사망지역

let 은 태어남과 동시에 자신이 속한 블록의 시작부터 선언부까지를 TDZ로 가진다.

 

위의 빨간 박스가 모두 TDZ이다.

 

말그대로 선언부 앞은 모두 TDZ라고 보면 된다.

'Developer' 카테고리의 다른 글

[JPA]첫걸음  (0) 2020.09.16
Controller와 RestController 차이  (0) 2020.09.09
javascript curry함수, 커링이란?  (0) 2020.08.05
Spring JDBC란?  (0) 2020.08.03
DataSource  (0) 2020.08.03
  Comments,     Trackbacks