오늘 한 일
스탠다드반 JPA, querydsl 세션 / spring 심화 querydsl 강의
개선 과제 querydsl 검색조건 / validation
문제 1
애플리케이션을 실행할 때마다 DB의 모든 데이터가 삭제된다.
재실행할 때 날아가던 쿼리문
alter table if exists comment
drop constraint if exists FKs1slvnkuemjsq2kj4h3vhx7i1
Hibernate:
alter table if exists comment
drop constraint if exists FKs1slvnkuemjsq2kj4h3vhx7i1
2024-02-06T15:24:06.020+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
drop table if exists comment cascade
Hibernate:
drop table if exists comment cascade
2024-02-06T15:24:06.040+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
drop table if exists member cascade
Hibernate:
drop table if exists member cascade
2024-02-06T15:24:06.058+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
drop table if exists post cascade
Hibernate:
drop table if exists post cascade
2024-02-06T15:24:06.082+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
create table comment (
id bigserial not null,
post_id bigint,
author varchar(255),
content varchar(255),
created_at varchar(255) not null,
member_id varchar(255),
primary key (id)
)
Hibernate:
create table comment (
id bigserial not null,
post_id bigint,
author varchar(255),
content varchar(255),
created_at varchar(255) not null,
member_id varchar(255),
primary key (id)
)
2024-02-06T15:24:06.108+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
create table member (
id bigserial not null,
email varchar(255),
nickname varchar(255),
password varchar(255),
role varchar(255) check (role in ('USER','ADMIN')),
status varchar(255) check (status in ('FALSE','TRUE')),
primary key (id)
)
Hibernate:
create table member (
id bigserial not null,
email varchar(255),
nickname varchar(255),
password varchar(255),
role varchar(255) check (role in ('USER','ADMIN')),
status varchar(255) check (status in ('FALSE','TRUE')),
primary key (id)
)
2024-02-06T15:24:06.132+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
create table post (
id bigserial not null,
author varchar(255),
content varchar(255),
created_at varchar(255) not null,
member_id varchar(255),
status varchar(255) check (status in ('TRUE','FALSE')),
title varchar(255),
primary key (id)
)
Hibernate:
create table post (
id bigserial not null,
author varchar(255),
content varchar(255),
created_at varchar(255) not null,
member_id varchar(255),
status varchar(255) check (status in ('TRUE','FALSE')),
title varchar(255),
primary key (id)
)
2024-02-06T15:24:06.161+09:00 DEBUG 11196 --- [ main] org.hibernate.SQL :
alter table if exists comment
add constraint FKs1slvnkuemjsq2kj4h3vhx7i1
foreign key (post_id)
references post
Hibernate:
alter table if exists comment
add constraint FKs1slvnkuemjsq2kj4h3vhx7i1
foreign key (post_id)
references post
재실행할 때마다 테이블이 삭제되고 새로 생성되고 있다.
심지어 컬럼의 string 타입들이 죄다 TEXT 가 아닌 VARCHAR 타입으로 생성되었다.
원인
spring:
jpa:
hibernate:
ddl-auto: create
ddl-auto 설정 create
(내가 이걸 왜 설정해놨는지 모르겠다 전혀 기억이 안 난다...)😰
ddl-auto : Entity 만 생성해놓으면 자동으로 DDL 을 작성하여 테이블을 생성하거나 수정한다.
옵션
- create : 기존 테이블 삭제 후 다시 생성
- create-drop : 종료시점에 테이블 drop
- update: 변경분만 반영
- validat : 정상 매핑되었는지만 확인
- none: 사용 X
난 지금 계속 만들고 변경하는 상황이니 update 나 validate 를 사용하면 된다고 한다....
뭣도 모르고 저렇게 설정해놓으면 나처럼 DB 데이터 다 날리니 그냥 ddl-auto 를 눈앞에서 치우자 🥲
페이지네이션
@Pageable 인터페이스
import org.springframework.data.domain.Pageable
@PageableDefult(size= , sort= )
PageRequest = Pageable 의 구현체
-> Page 형 반환
=> 몇 페이지까지 있는지 등의 정보를 프론트단에 넘겨줌
PageImpl ( content, pageable, total )
❓ Enum 을 컨트롤러에서 string 으로 받아오기
enum class PostStatus { TRUE, FALSE; companion object { @JvmStatic @JsonCreator(mode = JsonCreator.Mode.DELEGATING) fun parse(name: String?): PostStatus? = name?. let { EnumUtils.getEnumIgnoreCase(PostStatus::class.java, it.trim()) } } }
fetchJoin()
경고 로그
fetchjoin 으로 모두 가져오는데 그 후에 페이지네이션이 애플리케이션이 적용된다 => 데이터 多多多
=> 일대다 관계에서 fetchJoin 사용 지양해야한다. (다대일말고)
성능 최적화
=> fetchJoin 끄고 yml 파일에서 fetch size 설정
spring:
jpa:
properties:
hibernate:
default_batch_fetch_size:
querydsl
like vs contains
like
: 직접 %를 붙여서 원하는 곳에 포함이 되는지 확인할 때
contain
: 위치 상관없이 포함이 되는지 확인할 때 => 자동으로 앞뒤에 %가 붙어서 나간다.
BooleanExpression
: null 반환 시 자동으로 where 조건절에서 제거된다.
문제 2
n일전 게시글 조회 만드는데
비교하는 loe 메소드가 접근이 안된다
원인
QClass 생성할 때 createdAt 이 String 이었다.
그런데 내가 miusDays 를 쓰는 등 날짜 계산을 하기 위해 타입을 바꿔주었고 그 바꾼 타입이 QClass 에 반영이 안된 것
string 이었기 때문에 date 랑 비교가 불가한 것이었다.
해결
타입 변경사항이 있는 QClass 를 삭제 후 다시 complieKotlin
Path 가 LocalDateTime 으로 잘 바뀌었다.
Validation
Controller
받아올 때 @Valid 어노테이션
@PostMapping("/signup")
fun signup( @Valid @RequestBody signupRequest: SignupRequest): ResponseEntity<MemberResponse> {
return ResponseEntity.status(HttpStatus.CREATED).body(authService.signup(signupRequest))
}
@field NotBlank / Pattern
@Schema(description = "이메일", example = "email@email.com")
@field:NotBlank(message = "이메일을 입력하세요.")
@field:Pattern(regexp = "^[a-zA-Z0-9]+@[a-zA-Z0-9]+\$", message = "이메일 형식에 맞게 입력하세요.")
val email: String,
예외처리
valid 에러 == MethodArgumentNotValidException
@ExceptionHandler(MethodArgumentNotValidException::class)
fun handleMethodArgumentNotValidException(e: MethodArgumentNotValidException): ResponseEntity<String> {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(e.bindingResult.fieldErrors.get(0).defaultMessage)
}
bindingResult
: 바인딩 과정에서 오류가 발생하면 bindingResult 에 해당 오류가 저장된다.
fieldErrors
: 유효성 검사 오류
defaultMessage
: 지정된 오류 메시지
내일 할 일
테스트 코드 작성, 이메일 5분 인증, 이미지 업로드
'왕초보일지' 카테고리의 다른 글
240208 TIL | (0) | 2024.02.08 |
---|---|
240207 TIL | ObjectMapper (0) | 2024.02.07 |
240202 TIL | validation / spring aop / querydsl (0) | 2024.02.02 |
복습과제 (0) | 2024.02.02 |
240201 TIL | ubuntu 환경에 docker 설치하고 실행하기 (0) | 2024.02.01 |