Spring-Boot 12

[Spring-Boot] 세션 URL 리라이팅 해결 방법 /;jsessionid=

SSR 방식으로 프로젝트를 진행하고 있어서 토큰 방식을 사용하지 않고 세션 방식으로 로그인을 구현 해두었는데, 로그인이 완료되면 게시글이 조회되지않고 http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872 이런 url로 리라이팅이 되는 현상을 발견했다. 이유를 알아보았는데, 로그인을 처음 시도하면 URL을 위와 같이 jsessionid를 포함하여 보내게 된다. - 웹 브라우저가 쿠키를 지원하지 않을 때, 쿠키 대신 URL을 통해서 세션을 유지하는 것 - 사용하려면 URL에 이 값을 계속 포함하여 전달 해야 한다. 🔎 URL 전달 방식 끄기 옵션 application.properties server.servlet.session.tracking..

Spring-Boot 2024.04.15

Spring Data JPA를 활용한 Update 처리(변경감지, 더티체킹)

최근 Spring Data JPA를 사용하며 SSR 방식으로 개발중이다. 게시글 정보를 수정하는 Update 로직을 처리 하려고 한다 JPA에서 Update 처리 로직을 보기 전에 변경감지(더티체킹)이 뭔지 알아보자 더티체킹이란? Transaction안에서 엔티티의 변경이 일어나면 변경내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다. 게시글을 관리하는 BoardService의 updateBoard 메서드이다. 우리가 생각하는 JPA를 활용한 쿼리 처리는 JPARepository를 상속받고 있는 boardReporitory 인터페이스에서 JPA에서 제공해주는 기본 메서드인 findAll(), deleteById() 등 이런 메서드를 사용하여 update도 똑같이 처리를 할거라고 생각하겠지만, 소스를..

Spring-Boot 2024.04.13

[Spring-Boot] no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 해결 방법

문제 컨트롤러에서 /search GET 요청이 들어오면 SearchBoadRequest 라는 DTO를 requestBody로 받아와 boardService에 searchBoard() 메서드에 request를 보내주고 요청을 처리하게 되어있다. 여기서 문제는 DTO 사용에서 문제가 생긴 것이다. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `board.dto.SearchBoardRequest` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property..

Spring-Boot 2024.02.07

PRG 패턴 : Post → Redirect → Get

PRG 패턴이란? 웹 개발 패턴 중 자주 사용되는 패턴으로 HTTP POST 요청에 대한 응답이 GET 요청을 위한 URI로 리다이렉트되는 것이다. 현재 문제점 상품 등록 버튼을 누르면 POST로 /add를 호출한다. 그 후 결과물이 POST로 남아있다. 마지막으로 요청한 것은 POST/add이다. 그 결과 새로고침을 하면 마지막 요청이 반복되므로 id만 증가하고 중복된 상품이 계속 등록된다. 웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송하기 때문이다. 등록완료 페이지에서 새로고침을 누르게되면 이런식으로 중복된 데이터가 계속 쌓이게 된다. 이것을 해결할 수 있는 방법이 PRG 패턴을 적용시키는 것이다. PRG 패턴 적용 후 흐름 상품 등록 버튼을 누르면 POST /add가 호출된다...

Spring-Boot 2024.01.26

[Spring-Boot] @Controller vs @RestContoller 차이점

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다. 이번에는 이 2가지 어노테이션의 차이점에 대해 정리해보겠다. 주요 차이점은 @ResponseBody가 생성되는 방식. 즉, @Controller + @ResponseBody 조합 = @RestContoller 이다. @Controller 전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View(화면)를 반환하기 위해 사용됨. 아래와 같은 요청으로 view를 반환하게 됨. Client는 URL 형식으로 요청을 보냄. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾음. Handler Mapping을 통해 해당 요청을 받는 Con..

Spring-Boot 2024.01.23

[Spring-Boot] 스프링부트에서 jstl 사용시 빨간줄 에러 해결방법

Spring Boot에서 jstl를 사용하려고 했는데 이렇게 인식이 안되는 에러가 발생했다. 분명 build.gradle에 디펜던시도 잘 추가해뒀는데 왜 이런지 알아보았다. 💡 해결 방법 스프링 3.0 버전 이상부터는 implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상 implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' //스프링부트 3.0 이상 implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상 디펜던시를 이렇게 설정하면 해결이 된다. 디펜던시 설정을 하고 나니 정상적으로 해결이..

Spring-Boot 2024.01.18

[Spring-Boot] 테스트케이스의 @Transactional

스프링부트로 통합 테스트를 하던 중 통합테스트를 해보았다. 간단한 테스트 코드를 보자. memberService.join(member) 호출해서 실제로 데이터베이스를 select를 해보면 테스트 코드에서 테스트용으로 생성한 member 객체의 name인 'hello'가 반영이 된걸 볼 수 있다. 하지만, 테스트 코드의 의미와 다르게 실제 데이터베이스에 적용이 되는게 좀 이상하지않은가? 그렇다. 사실 우리가 테스트하는 데이터들은 실제 디비에 반영이 되지않고 테스트 내에서만 검증을 하고 마쳐야하고, 반복적인 테스트에도 예외가 없어야한다 여기서 만약에 한번 더 가입 테스트를 실행해보면 예상과 같이 이렇게 빨간 불이 뜨면서 내가 미리 선언해둔 '이미 존재하는 회원' 이라는 예외로 넘어가게 된다. 우리가 테스트를..

Spring-Boot 2024.01.12

메이븐(maven) vs 그래들(gradle) 비교

인텔리제이로 스프링 부트 프로젝트를 생성하는 도중 Type 부분을 보면 gradle과 maven이 있는걸 확인했다 둘다 빌드 관리 도구인건 알았으나 어떤 차이점이 있는지 몰라 확실하게 알아보고자 한다 1. 메이븐(maven) 아파치 메이븐은 자바용 프로젝트 관리 도구이다 아파치 Ant의 대안으로 만들어짐 프로젝트를 진행하면서 수많은 라이브러리를 관리 해주는 도구이다 여기서 메이븐의 특징은 그 라이브러리들과 연관된 라이브러리들까지 거미줄처럼 모두 연동이 되어 관리가 가능해진다는 점이다 POM - project object model Maven의 기능을 이용하기위해서는 POM을 사용한다 POM은 약자 이름 그대로 project object model의 정보를 담고 있는 파일이다 pom.xml에서 주요하게 다..

Spring-Boot 2023.12.20

ORM이란?

어플리케이션의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미한다 - java의 데이트 클래스와 관계형 데이터베이스의 테이블을 매핑 객제치향 프로그래밍과 관계형 데이터베이스의 차이로 발생하는 제약 사항을 해결해주는 역할 수행 대표적으로 JPA, Hibernate등이 있음 ORM의 장점 1. SQL 쿼리가 아닌 직관적인 코드로 데이터를 조작할 수 있다 2. 재사용 및 유지보수가 편리하다 3. DBMS에 대한 종속성이 줄어듬 ORM의 단점 1. 복잡성이 커질 경우 ORM만으로 구현하기 어려움 - 직접 쿼리를 구현하지않아 복잡한 설계가 어렵다 2. 대형 쿼리는 별도의 튜닝이 필요할 수 있음 JPA란? JPA는 Java Persistance API의 줄임말이며, ORM과 관련된 인터페이스의 ..

Spring-Boot 2023.10.25

OAuth란?

OAuth는 제3의 서비스에 계정 관리를 맡기는 방식이다. 흔히 볼 수 있는 네이버로 로그인하기, 구글로 로그인하기 같은 방법이다. OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할수 있다. 리소스 오너 정보를 취득할 수 있는 방법은 4가지가 있다. 종류(type) 설명(description) 권한 부여 코드 승인 타입(Authorization Code Grant) OAuth 2.0에서 가장 잘 알려진 인증밥법. 클라리언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급받는 방식 암시적 승인 타입(Implicit Grant) 서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서..

Spring-Boot 2023.07.27