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