본문 바로가기
카테고리 없음

TIL-18

by 오우지 2021. 10. 13.

껄껄 오늘 로그인을 완성했다. 정규화 부분이나 중복확인 등등은 강의에서 들은 코드 긁어오기만 하면 되지만 스타일 태그들을 설정해주는데 시간이 정말 오래 걸렸다. 왜 프론트를 하는 사람과 백엔드를 하는 사람이 나눠져 있는지, 둘 다 잘하는 사람이 얼마나 대단한 사람인지 알게 된 최근 며칠이었던것 같다. 혹시 하고 프로그램이 시작되기 전에 css랑 javascript 강의를 들을까 했는데 왜 안들었니 그때. 왜그랬어

 

JWT 토큰을 처음 사용해봤는데 확실히 어떤 구조인지에 대한 이해를 하고 들어가는게 삽질을 덜 하고 들어가는 것 같다.

오늘 로그인에서 가장 중요한 코드를 꼽자면 이부분인 것 같다.

$.ajax({
        type: "POST",
        url: "/sign_in",
        data: {
            username_give: username,
            password_give: password
        },
        success: function (response) {
            console.log(response)
            if (response['result'] == 'success') {
                $.cookie('mytoken', response['token'], {path: '/'});
                window.location.href = "/"
            } else {
                alert(response['msg'])
            }
        }
    });

브라우저에 토큰을 박아버리는 부분. 이것만 알면 된다. 해쉬나 다른 암호화 과정은 알고 있다는 전제 하에.

 

오늘 오후에는 카카오 로그인을 구현하려고 했는데 하기 귀찮은 것도 있었고 내가 멀티테스킹에 취약하다는 것 등 여러 이유가 있겠지만 그냥 데드라인이 내일이라는 생각 때문에 안한 것 같다. 오늘까지였으면 어떻게든 했을것 같긴 하다.

 

이미 밀려버린 스터디 진도 JPA다. 이것도 이것대로 스트레스다.

오늘은 즉시 로딩과 지연로딩

 

연관관계 매핑 시에

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
    private Team team;

이렇게 하고 Member를 호출하고 Team을 출력해보면 Team은 프록시 값이 나온다. 지연로딩이다.

Team에서 getName을 호출하는 순간 진짜 객체를 불러온다.

 

EAGER를 설정하면 그냥 다 엮여서 언제든 호출이 가능하다.

 

단순하다. 기본은 지연 로딩으로 생각하면 된다. 즉시 로딩을 사용하면

1. 예상하지 못한 SQL이 나온다.

2. JPQL에서 N+1 문제를 일으킨다. - 나는 member만 불렀는데 거기에 추가적 쿼리가 실행된다.

3. ManyToOne, OneToOne은 기본이 EAGER이기 때문에 LAZY로 바꿔줘야 한다.

 


영속성 전이(Cascade)와 고아 객체

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)

기존대로 Parent와 ChildList를 사용하려면 Parent와 Child를 각각 영속화 해줘야 하지만 Cascade를 사용하면

안해줘도 Parent만 호출해도 알아서 영속화된다.

1. 영속성 전이는 연관관계 매핑과 관련이 없다.

2. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공하는 것 뿐이다.

 

종류는 여러가지 있지만

ALL: 모두 적용, PERSIST: 영속화 두개만 주로 쓰인다.

게시글의 댓글 등에서는 써도 되지만 그 외에 다른 부모들과 연관관계가 있는 Child들은 영속성 전이를 사용하면 안된다. 관리가 매우 어려워진다. 라이프 사이클이 유사하고 단일 소유자 일때만 사용해야 한다. 

 

 

고아 객체: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제

@OneToMany(mappedBy="parent", orphanRemoval = true)

똑같이 특정 엔티티가 소유할 때만 사용해야 한다.

 

cascade와 orphanRemoval을 함께 사용하면 부모 엔티티를 통해 자식의 생명 주기를 관리할 수 있다.

도메인 주도 설계의 Aggregate Root개념을 구현할 때 유용

 

Ex)

order와 delivery는 함께 생겨야 하므로 cascade = ALL

order와 orderItem도 함께 생겨야 하므로 cascade = ALL

이지만 비즈니스 상황에 따라 고려해봐야 한다. 

 

 

 

JPA의 데이터 타입 분류

-엔티티 타입

@Entity로 정의하는 객체

데이터가 변해도 식별자로 지속해서 추적 가능

예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능

 

-값 타입

int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체

식별자가 없고 값만 있으므로 변경시 추적 불가.

숫자 100을 200으로 변경하면 완전히 다른 값으로 변한다.

 

값 타입에는

1. 기본값 타입(int, double), 래퍼 클래스(Integer, Long), String

2. 임베디드 타입(좌표 등을 만들기 위한 기본 값들의 모임)

3. 컬렉션 값 타입

 

자바의 기본 타입은 공유하지 않지만 Integer같은 래퍼 클래스나 String같은 특수한 클래스는 공유 가능한 객체이지만 변경이 불가능해서 side effect가 발생하지 않는다.