blog - 3

Lumi·2021년 8월 16일
0

project

목록 보기
6/16
post-thumbnail

Entity class 들



기본적인 @ID나 @GeneratedValue등은 설명을 생략하겠다.

  • @Lob

대용량 데이터를 받을떄 사용하는 어노테이션으로 html을 받을떄에 자주 사용된다.

  • @JoinColumn

DB에서 USER에 접근할떄 입력되는 이름을 지정(필드값)
-> 사용을 안해야 하는 경우가 있는데 그것은 데이터의 1정규화가 위반될떄
이것은 부가적인 설명에서 다뤄보겠다.

이처럼 User을 참조하는 값의 @JoinColumn의 이름을 userId로 지정하면
테이블을 생성할떄 필드값이 userId가 된다.

  • @ColumnDefault("''")

Column의 default값을 설정할수 있는 어노테이션이다.
class들을 참고하면 알겠지만 " " 은 어떤 타입이든 들어가야 하며 String 값은 ' '이 추가되어 들어가게 된다.

  • @CreationTimestamp

시간을 자동으로 입력해주는 어노테이션이다.(now 값이다)

  • 연관관계

이처럼 연관관계를 지정해주면 테이블에서 표기가 된다.
-> @JoinColumn에서 지정한 필드값으로 입력이 된다는것을 알수가 있다.

연관관계 주인에 대해서 부가적인 설명

연관관계 주인 = FK를 가진 오브젝트

만약 우리가 Board(id=1) 인값을 호출하고 싶다면 User의 값 또한 호출이 되게 된다.

  • JPA에서 호출을 하게 되면 Join을 통해서 DB에 값이 전송되고
    자동으로 연관관계를 맺고있는 User도 호출이 되게 된다.

만약 Reply의 정보도 가져오고 싶다면 마찬가지고 연관관계를 맺어주면 된다.

** 어떻게 보면 굉장히 유용하지만 성능이 많이 낮아진다..(가져오는 데이터가 많아서)

만약 Reply의 값을 가져 오게 된다면
Board(1)의 값에 User(1)의 값이 올수 있게 되지만
Reply의 값은 여러개가 올수가 있다.
하나의 게시글에 많은 댓글이 달릴수 있기 떄문에

그러기 떄문에 Fk의 값을 가져올 필요가 없으니 Reply에서는 @JoinColumn을 추가하지 않아야 한다.

이와 같이 사용한다.

대신 mappedBy를 추가해주어야 한다.

  • mappedBy : 연관관계의 주인이 아니다 = Fk가 아니니 DB에 Reply컬럼을 만들지 말라는 의미


" " 안에는 Reply에서 Board를 참조하는 변수명을 입력해 준다.

  • 보통 OneToMany 에서는 @JoinColumn을 사용하지 않는다고 보면 된다.
  • @JoinColumn을 사용하지 않으면 mappedBy를 사용해야 한다.

이 내용을 통해서 FetchType을 설명할수가 있는데
LAZY 타입은 OneToMany의 기본타입이며

  • 필요하면 불러오고 필요없으면 안불러올게 란 의미

EAGER타입은 ManyToOne의 기본타입이다

  • 무조권 값을 들고 와 라는 의미이다.

Project 구성은 한페이지에 게시글, 작성자, 댓글을 모두 보이게 할것이기 떄문에 Reply연관관계를 EAGER타입으로 지정하였다.

Json

정말 간단하게 설명을 하자면 중간 유통업체 이다.

만약 java에서 파이썬쪽으로 데이터를 전송하게 되면

java언어 -> java 언어를 json변환 -> 파이썬 도착 -> json을 파이썬 언어로 변환 -> 데이터 활용

이렇게 중간 통신에서 공통적으로 이용되는 형태를 json이라고 한다.

통신을 한다고 하면 java 언어를 json형태로 전송을 한다라는 의미이다.

Repository

많이 해보았기 떄문에 skip 하겠다.

강의내용중 하나 모르는점은 @ColumnDefault("''")이것이다.

나는 User의 role이라는 변수가 default일떄 user를 부여하게 했었는데
이게 작동을 하려면 쿼리에 role값이 나오면 안된다.

이런 쿼리가 나와야 @ColumnDefault이 작동을 하게 된다.

이런 쿼리가 나오게 하기 위해서 @DynamicInsert를 사용 한다.
-> class에 부여하는 어노테이션으로 insert할떄 null인 field를 제외 시켜준다.

@DynamicInsert을 User class에 넣어준다면 insert할떄에 role가 나오지 않게 된다.

하지만 이런 어노테이션을 사용하게 된다면 코드가 지저분해기 떄문에 그냥 간단하게 @ColumnDefault 와 @DynamicInsert를 둘다 사용하지않고

값을 저장하기 전에 직접 값을 저장해주면 된다.

  • user.setRole("user");

하지만 이 방법도 개발자가 코드를 짜면서 실수를 할수 있기 떄문에 enum을 사용하는것이 가장 효율적이다.

  • 결과적으로 그냥 Enum을 사용하면 된다.

enum을 사용하는 방법은 코드를 직접 보는것이 좋을 것 같다.
깃 허브 주소 : https://github.com/HoJin-jjimgo/Project-blog

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글