직접 작성한 쿼리문을 테스트 하기 위해서 리포지토리 테스트를 작성했다.먼저 리포지토리 테스트를 위한 데이터베이스를 설정했다.보통 GIVEN 절에서 데이터를 설정할 때 모든 메서드에서 공동으로 사용하는 데이터가 있을 경우 BeforeEach를 활용해 중복을 제거할 수 있
KEEP(지속할 것) 프로젝트 타임라인 설정 -> 기획 단계에서 기본 틀을 만들어놔서 개발할 때 매끄럽게 계획들을 진행할 수 있었다. 스프레드 시트로 테스트 코드 시나리오 공유 -> 다른 팀원의 도메인 정책을 이해하는데 아주 좋았다. PROBLEM(문제가 된 것) 추
로그인을 하면 리프레시 토큰이 저장되고(empty claims이다) 로그아웃을 하면 널값으로 바뀐다. Member.kt MemberService.kt 리프레시 토큰을 사용하면 왜 좋을까? 엑세스 토큰의 보안을 위해 엑세스 토큰의 시간을 짧게 지정하고 만료되기까지 더 긴 시간이 걸리는 리프레시 토큰으로 서
로그인 오류 java.lang.ClassCastException: class java.lang.String cannot be cast to class com.teamsparta.member.global.auth.UserPrincipal (java.lang.String is in module java.base of loader 'bootstrap'; com...
엔티티가 생성되고 변경되는 시점을 감지해 생성시각, 수정시각을 기록할 수 있다. 먼저 EnableJpaAuditing 어노테이션을 사용하여, Auditing을 활성화 해야한다. 이후 엔티티 클래스에 상속받고 사용한다.
양방향 매핑 문제는 순환 참조 문제가 생길 수 있다. 서로를 계속 호출하는 문제가 발생! 순환 참조 문제 객체.response를 쓰는 이유는 서로의 엔티티를 계속 참조하다가 발생하는 순환참조를 방지하기 위해서다.
FK만 집어 넣은 연관관계 매핑 team id로 매핑은 되지만 DB와 DB 사이를 억지로 집어넣은 느낌이 든다. 동작도 가능하지만 객체를 집어넣어서 매핑하는게 객체지향적으로 좋다. 이렇게 나온 개념이 ManyToOne, OneToMany라고 한다. 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 테이블: 외래 키로 조...
@Valid 를 사용하기 위해 implementation 'org.springframework.boot:spring-boot-starter-validation' 추가 후, LoginRequest.kt SignUpRequest.kt Validation 관련 annotation에 @field:를 prefix로 붙이고 message에 출력문을 적어준다. ...
NoSuchEntityException 오류 메시지가 "존재하지 않는 %s입니다." 인데, 발생한 오류가NoSuchEntityException("MEMBER")였을때 오류 메시지는 "존재하지 않는 MEMBER입니다." NoSuchEntityException("POST") 의 오류가 발생했을때에도 "존재하지 않는 MEMBER입니다." 와 같이 이전의 ...
CommentRequest.kt Comment.kt CommentService.kt request에서 변경한 newContent를 content에 넣어주기만 해도 1차캐시(newContent)와 스냅샷(최초의 content)이 달라져서 flush() 되는 과정중에 업데이트 쿼리가 생성된다. update 메서드 안에 있는 content는 엔티티 컬럼의...
날짜만 가져오기 오답1 오답2 정답 %Y 연도, 숫자, 네 자리 %m 월, 숫자 ( 00.. 12) %d 월의 일 ( 00.. 31)
Fetch Join 패치조인은 sql 에 존재하는 조인의 종류가 아닌 JPQL 의 성능을 최적화하기 위해 제공하는 조인의 한 형태이다. Qcomment 로 EntityPathBase 를 만들어 comment 변수로 comment 엔티티에 접근 가능하게 만들고, .leftJoin 으로 todo.comments -> todo 와 comment 로 이뤄진 ...
DB가 제공하는 트랜잭션 기능을 사용하면 commit과 rollback으로 정상적인 작업이 가능하도록 할 수 있다. 계좌이체를 예시로 들면, 트랜잭션이 없다면 작업중 서버에 오류가 났을 때 중간에 이체된 돈은 그냥 사라지고 만다. 이런 서비스 참사를 막기 위해서 작업 중 하나라도 실패를 한다면 거래 이전으로 되돌리는데 이것을 롤백(rollback)이라...
영속성 컨텍스트 DB와 프로그램 사이에 공간이 있는데 이 공간이 영속성 컨텍스트이다. JPA 의 영속성 컨텍스트로 관리되는 엔티티들 엔티티의 생명주기 비영속 -> transient(new): 새로 작성된 엔티티가 영속성 컨텍스트에 담기기 전 상태 영속 -> managed: 영속성 컨텍스트에 담겨 관리되는 상태 준영속 -> detach...
EntitiyManager 와 EntitiyManagerFactory 특징 엔티티 매니저 팩토리 엔티티 매니저 팩토리에서 필요할 때마다 여러 개의 엔티티 매니저를 생성해준다. 셍성비용이 크다. 한개만 만들어 프로그램 전체에서 공유하도록 설계되어 있다. 여러 스레드가 동시에 접근해도 안전하게 설계되었다. 엔티티 매니저 생성 비용...
fetch() : 리스트로 결과를 반환하는 방법. (만약에 데이터가 없으면 빈 리스트를 반환) fetchOne() fetchOne()은 getSingleResult(query)를 반환한다. getSingleResult()는 결과가 여러 건일 때 NonUniqueResultException을 throw한다. 이로 인해, fetchOne()을 사용하게 되면...
@Component 개발자가 직접 작성한 클래스를 빈으로 등록하고 싶을 때 사용 @Configuration 개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 사용
위에서 보면 OOP 옆에서 보면 AOP 트랜잭셔널을 이용해서 서비스를 오가며 사용 어플리케이션의 진행 단계 Aspect 횡단 관심사(부가기능)를 모듈화한 단위이다. Aspect는 부가기능을 정의하는 Advice와 적용 위치를 결정하는 PointCut으로 구성된다. PointCut Aspect가 적용될 프로그램상 실제 위치이다. JoinP...
게시판 (페이지네이션) 컨트롤러에서 전체 데이터의 개수를 세는 count 쿼리가 포함된 Page 객체를 반환타입으로 받았다. 서비스 구현에서 Pageable 인터페이스를 상속받아 Pageable의 구현체 PageRequest 생성자의 파라미터에 현재페이지, 조회할 데이터 수, 정렬 정보를 넣었다. Offset 방식을 사용해 limit 예약어를 통하여 ...