Spring 98

[Spring 기본편] (1) 스프링이란 / 스프링과 객체 지향에 대하여

Spring(스프링) - 스프링이란, 자바 언어 기반의 프레임워크 - 자바 언어의 가장 큰 특징 = 객체 지향 언어 - 스프링은 객체 지향 언어가 가진 강력한 특징(객체지향)을 살려내는 프레임워크 -> 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크 Spring Framwork(스프링 프레임워크) - 스프링의 핵심기술 Spring boot(스프링 부트) - 스프링 부트란, 스프링을 편리하게 사용할 수 있도록 지원 - 단독으로 실행할 수 있는 스프링 어플리케이션을 쉽게 생성 - Tomcat 같은 웹서버를 내장해서 별도의 웹서버를 설치하지 않아도 됨 - 손쉬운 빌드 구성을 위한 starter 종속성 제공 (Dependency 라이브러리 간편 관리) - 스프링과 3rd parth(외..

[Spring] 스프링 순환 참조, 무한 재귀 해결하기 (DTO, JsonIgnore)

jpa 엔티티 일대다 : 다대일 관계 생성시 흔하게 일어나는 순환 참조문제, 이전 프로젝트에서는 뭣도 모르고 @jsonignore로 처리했었는데, 이게 왜 일어나는지 공부해보니, 좋지 않은 방법이였다는 걸 깨달았다,.. JPA에서 순환참조 문제는 이제 알고보니까는, 엔티티를 조회할 떄 발생하는 게 아니라 entity를 json으로 변환할 떄, 즉, Entity To Json serialize할 때 (보통 controller 단)에서 일어나는 문제였다. Entity를 Json으로 변환하면서, 연관된 객체를 다시 Json으로 변환하고, 이 변환 과정에서, 다시 연관된 객체의 연관된 객체를 참조... 참조 지옥,,, 무한 참조,,, 크기가 펑펑펑,, 스프링 무한 순환 참조 문제 해결 방법 @jsonignore..

Spring/Spring Boot 2022.04.20

[Spring] 스프링 엔티티 삭제 시점 히스토리 기록하기 (Soft Delete)

생성시간과, 삭제시간은 jpaAuditing으로 기록이 가능했는데, 삭제시점을 자동을 체크해주고 싶어서 찾아보니 jpaAuditing에는 없었다 흨,,ㅠ 그러다 하이버네이트에서, delete 시점을 체크할 수 있는 @SqlDelete 와 default 조건절을 붙히는 @where 를 발견했다..! Soft Delete ex) `UPDATE table SET delete = 1 WHERE id = 2` 형태로 ROW가 삭제 되지 않고 flag를 통한 제어 하는 방식 delete가 되더라도, 데이터를 지우는게 아닌, column 값을 변경하여, 데이터를 제어하는 방법이다, @SQLDelete Annotation @SQLDelete 어노테이션을 통해, 실제 삭제가 이루어질때 수행 할 쿼리를 적으면 된다. ex..

Spring/Spring Boot 2022.04.20

[Spring err] 스프링 시큐리티 - Consider defining a bean of type 'org.springframework.security.crypto.password.PasswordEncoder' in your configuration.

Parameter 1 of constructor in com.example.zaritalk.service.UserService required a bean of type 'org.springframework.security.crypto.password.PasswordEncoder' that could not be found. package com.example.zaritalk.service; import com.example.zaritalk.domain.user.User; import com.example.zaritalk.domain.user.UserRole; import com.example.zaritalk.dto.SignupRequestDto; import com.example.zaritalk.rep..

Spring/Spring err 2022.04.20

[JPA] Fetch join 과 Join 차이점

fetch join은 불러온 데이터까지 영속성 컨텍스트에 저장하지만 join은 불러온 데이터를 영속성 컨텍스트에 저장하지 않는다...! Fetch Join 조회 주체가 되는 엔티티와 연관 관계의 엔티티(JOIN) 까지 모두 조회하여 영속화한다. 즉, 2개의 엔티티 모두 영속성 컨텍스트로 관리되어진다. 일반 Join 조회 주체가 되는 엔티티만 조회하고 영속화한다. 만약 연관 관계의 엔티티 데이터를 사용해야 할 경우 별도의 조회 쿼리문을 실행 해야 함. FetchType.EAGER 일 경우, 연관 관계의 엔티티를 영속화하기 위해 N번의 쿼리를 발생시킴. FetchType.LAZY 일 경우, 최초 조회시 획득한 id 로 조회를 N번해야함. [참고] https://velog.io/@heoseungyeon/Fet..

Spring/Spring Boot 2022.04.20

[Spring] 스프링 부트 JPA 페이징 성능 개선 - querydsl 페이지네이션(오프셋 페이징, 커서 페이징, querydsl 정렬)

JPA N+1 문제를 해결했으니, 이제 페이지네이션 성능개선을 해볼려고 한다. https://thalals.tistory.com/246 [Spring] 스프링 부트 페이지네이션 (Query, JPA, offset / cursor 페이지네이션) 페이지네이션을 구현해보자!! spring boot 의 JPA를 이용해서 구현을 할 예정이다 페이지네이션을 구하기 위해서는 요롷게 3가지를 생각해 주어야한다. view size : 한페이지에 보여줄 개수 total page : thalals.tistory.com 이전에, 페이지네이션에 대해 공부해 보았을 떄 offset 과 cursor 2가지 방식의 페이지네이션 구현 방법이 존재하고 JPA 페이징 API는 오프셋 기반 방식이라는 것을 확인한 적이 있다. 오늘은, JP..

Spring/Spring Boot 2022.04.10

[Spring/스프링] springboot gradle - XSS 스크립트 오류 해결하기 (with @RequestBody)

프로젝트 댓글에, 누군가 XSS 공격을 해놓았다.. 껄껄껄 이론으로만 알던걸 직접 당해보니 기분이 새롭고 상쾌하다 해결하자!! 1.XSS 란 2. Spring에서 Xss 해결하기 1. XSS 란 Crooss-site Scripting으로, 클라이언트가 입력값으로 악의적인 스크립트 문을 삽입하여, 개발자의 의도대로 동작하지 않게하는 공격을 말합니다. 바로 아래처럼,,..!! ㅠㅠ 2. Spring에서 Xss 해결하기 XSS 공격을 예방하는 방법으로는, 특정문자 치환하기 특정문자 입력시 검사 후, 입력받지 않게하기 모든 body태그에 C:out 입력하기.. 등등 하지만! 네이버에서 이 기능등을, lucy xss servlet filter라는 정의해둔 라이브러리가 존재한다, 이걸 프로젝트에 적용해서 사용해보자..

Spring/Spring Boot 2022.04.05

[Spring] JPA N+1 문제 해결방법(지연로딩 N+1, OneToMany, ManyToOne 연관관계, fetch join, 페이지네이션)

이번 글에서는, JPA N+1 문제가 무엇인지,, 왜일어나고,,, 어떤 해결방법이 있는지 알아보고 내 프로젝트에 적용해 보고자 한다! 결과적으로, N+1 문제를 해결하면서 페이지네이션까지 하고자한다! JPA N+1 문제 JPA N+1문제란, JPA가 데이터를 조회할 때, 연관관계 매핑에있는 객체들을 함께 조회하여(N개 만큼) 추가 쿼리가 발생하는 문제를 N+1 문제라고 합니다. JPA는 JPQL을 생성하여 실행하게 되는데, 엔티티 객체와 필드이름을 이용하여 쿼리를 만든다. 이때 객체의 연관관계 매핑에 의해서 관계가 맺어진 다른 객체들이 함께 조회된다. 지연로딩시 N+1 문제가 발생하지 않나요? JPA의 FetchType으로는 즉시로딩과 지연로딩 이 있습니다. (이전 글 참고) 즉시로딩시, 연관된 모든 객..

Spring/Spring Boot 2022.03.30

[Spring] JPA 즉시 로딩과 지연 로딩

JPA는 데이터를 조회할 때, `FetchType` 으로 `즉시로딩(Eager)` 과 `지연로딩(Lazy)`가 있습니다. 참고로 JPA FetcyType의 default값은 @xxToOne에서는 EAGER, @xxToMany에서는 LAZY입니다. Feth Type이란 이 FetchType이란, JPA가 하나의 Entity를 조회할 때, 연관관계에있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값 입니다. JPA는 ORM기술로, 사용자가 직접 쿼리를 생성하지 않고, JPA에서 JPQL을 이용하여 쿼리문을 생성하기 때문에, 객체와 필드를 보고 쿼리를 생성합니다. 따라서 다른 객체와 연관관계 매핑이 되어있으면 그 객체들 까지 조회하게 되는데, 이때 이 객체를 어떻게 불러올 것인가를 설정할 수 있습니다. 즉시..

Spring/Spring Boot 2022.03.23