Skip to content

Instantly share code, notes, and snippets.

View LeoHeo's full-sized avatar

JinHan LeoHeo

View GitHub Profile
@Entity
// 일부 데이터베이스에서는 ORDER는 예약어로 잡혀있어서 테이블 생성이 안될 수 있다 -> 대표적으로 h2에서 돌린다면 에러가 난다.
// 그래서 Table name을 ORDERS로 한다.
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@LeoHeo
LeoHeo / Find.java
Last active February 20, 2018 11:31
// 기본키 값 생성
MemberProductId memberProductId = new MemberProductId();
memberProductId.setMember("member1");
memberProductId.setProduct("productA");
// 해당하는 MemberProduct 불러오기
MemberProduct memberProduct = em.find(MemberProduct.class, memberProductId);
assertNotNull(memberProduct);
// 기본키 값 생성
MemberProductId memberProductId = new MemberProductId();
memberProductId.setMember("member1");
memberProductId.setProduct("productA");
// 해당하는 MemberProduct 불러오기
MemberProduct memberProduct = em.find(MemberProduct.class, memberProductId);
assertNotNull(memberProduct);
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
@OneToMany(mappedBy = "member")
private List<MemberProduct> memberProducts = new ArrayList<>();
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Strig id;
// 나머지 생략
@ManyToMany
CREATE TABLE MEMBER_PRODUCT (
MEMBERS_MEMBER_ID VARCHAR(255) NOT NULL,
PRODUCT_PRODUCT_ID VARCHAR(255) NOT NULL
)
@LeoHeo
LeoHeo / Member.java
Last active February 20, 2018 09:59
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Strig id;
// 나머지 생략
@ManyToMany
@LeoHeo
LeoHeo / persistence.xml
Created February 9, 2018 11:19
JPA 예제 tcp 이용할때
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>

Entity를 DTO로 안 담고 바로 JSON으로 뽑고자 할때

  • 엔티티 객체를 json 변환의 비추하는 이유는 http 상에 불필요 필드 혹은 컬럼 값까지 노출된다.
  • json으로 직렬화 하면서 내부 모든 정보를 다 탐색합니다. 그러면 lazy형태의 속성들도 다 로딩해서 찾아보는데 만약 서로 참조하고 잇는 entity가 존재하는 경우 스택오버플로우 문제가 많이 생긴다.
  • lazy 로딩의 장점을 잃어버리는 개발적 장점을 잃으면서 동시에 엔터티 변경에 따른 api구조 자체도 변경이 되서 서로간의 규약 이슈도 있고 보안적으로 중요한 정보도 나도 모르는사이에 노출될수도 있고 단점이 너무 많다. Entity은 요구사항에 따라서 언제나 변한다.
  • 그리고 데이타가 큰경우 엄청남 쿼리가 발생된다. ( lazy로딩으로 인한 문제로 인해 ) 단순하게 말해서 post가 board를 호출하고 board가 또 내부 다른 entity를 호출하고 이런식으로 계속 진행하면서 속도도 엄청 느려집니다 -> N + 1문제...??
  • Entity가 적을때는 문제 없고 서로 참조하는 경우가 안생겨서 괜찮았겠지만 점점 많은 entity가 생기는 경우 제어가 불가능해진다. 그래서 보통 api가 필요한 정보만 추출해서 다 로딩한 후 ( 보통 fetch ) 그 부분만 dto로 바꿔서 json으로 변경한다. modelmapper, dozer, orika 같은 dto로 변환하는 라이브러리가 있긴한데 실사용해보니 그리 좋진 않았다.
  • Entity를 그대로 외부에 노출하면 Entity를 변경할 때 API도 변경. 엔티티는 생각보다 자주 변경된다. 그래서 중간에 DTO를 두어서 엔티티를 변경해도 외부에 노출하는 API는 변경되지 않도록 해야 합니다. 예를 들어 타 팀 또는 타 기업과 연동하는 API가 있다. 하지만 엔티티를 변경할 때 API를 사용하는 클라이언트도 동시에 변경할 수 있다면 실용적인 관점에서 엔티티를 그대로 노출하는 것도 하나의 방법이라 생각한다. 예를 들어 같은 프로젝트의 화면을 그리기 위한 Ajax 콜 같은 경우가 있
$ mvn package # maven은 build를 할려면 꼭 설치가 되어있어야 한다.
$ ./gradlew build # gradle project일 경우 gradle 설치 없이 빌드 할 수 있다.