여니의 프로그래밍 study/Spring & Spring Boot 63

[스프링부트] 개발하며 만난 에러 기록집 ( = 계속 업데이트 될 예정)

1. AWS S3 버킷 : Access Denied 에러 com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: ~~~~; S3 Extended Request ID https://eboong.tistory.com/543 [AWS S3 버킷] Access Denied 오류 해결 com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Re..

[스프링부트] "JWT 토큰"과 세션 기반 인증의 차이점

로그인 구현 방식 로그인 구현 방식에는 세션 방식과 JWT 토큰을 사용하는 방식이 있습니다. 일단 세션 방식에 대해 먼저 알아보겠습니다. 세션 방식이란? : 세션은 서버의 메모리에 생성되는 저장 공간입니다. 바로 이 저장공간에 로그인한 유저의 정보가 저장됩니다. 사용자가 로그인을 하게 되면 서버는 쿠키에 세션ID를 실어서 브라우저에게 보냅니다. 세션 방식을 사용하는 이유가 뭘까요? 일단 HTTP 프로토콜의 특징을 이해해야 합니다. Stateless (무상태 프로토콜) : 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하는 통신 프로토콜이빈다. 즉 서버에 세션 상태가 없는 상태를 의미합니다. Stateless 구조는 서버의 response가 클라이언트와의 세션 state와 독립적입니다..

[스프링부트] Error parsing HTTP request header

게시글 수정을 하는 테스트를 진행하던 도중 위와 같은 에러가 떴습니다. 찾아보니 http를 https로 써서 나타나는 문제라고 하여 아래 부분을 수정 후 다시 테스트를 진행했습니다. 그런데도 오류가 나서 자세히 살펴보니.... /api/v1이 아닌 /api/vi로 작성을 했더군요.. 컨트롤러에 적혀있는 주소랑 다르게 적혀 있어서 오류가 났나 봅니다 ㅠ.ㅠ

[스프링부트] PostsApiControllerTest.java (조회기능) + h2 데이터베이스 콘솔 사용법

h2 웹 콘솔을 사용하기 위해서는 application.properties에 아래 옵션을 추가해줍니다. spring.h2.console.enabled=true 그런 다음에 main 메소드를 실행시켜줍니다. 그러면 톰캣이 8080 포트로 실행됩니다. http://localhost:8080/h2-console로 접속하면 웹콘솔 화면이 등장합니다. JDBC URL에는 jdbc:h2:mem:testdb로 작성해줍니다. Connect 버튼을 클릭하면 현재 프로젝트의 h2를 관리할 수 있는 페이지로 이동합니다. POSTS 테이블이 정상적으로 나타나는 것을 확인할 수 있습니다. 조회하는 방법은 SELECT * FROM POSTS; select문을 입력해줍니다. 만약 현재 등록된 데이터가 없다면 insert into ..

[스프링부트] PostApiController Test 작성 (게시글 수정 기능)

Posts.java update 부분에 쿼리가 없는 이유는 JPA의 영속성 컨텍스트 때문입니다. 영속성 컨텍스트란? : 엔티티를 영구 저장하는 환경으로 일종의 논리적 개념입니다. JPA의 핵심 내용은 엔티티가 영속성 컨텍스트에 포함되어 있느냐 아니냐로 갈립니다. 만약 트랜잭션 안에서 데이터베이서에서 데이터를 가져오면? 이 데이터는 영속성 컨텍스트가 유지된 상태입니다. 이 상태에서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영합니다. 즉, Entity의 값만 변경하면 Update 쿼리를 따로 해줄 필요가 없어지빈다. 이 개념을 더티 체킹이라고 합니다. PostsRepository.java PostsUpdateRequestDto.java dto는 Entity의 필드 중 일..

[스프링부트] HTTP 구조 - header , body

HTTP 많이 들어본 용어인데 막상 설명하려고 하니까 입이 떨어지지 않아서 개념정리도 할 겸 포스팅 시작합니다. HTTP는 HyperText Transport Protocol의 약자입니다. 문서를 전송하기 위한 약속으로 해석됩니다. HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. 서버와 클라이언트 사이에서 어떻게 메세지를 교환할 지 정해놓은 규칙입니다. 80번 포트를 사용하고 HTTP의 구조는 요청(Request)와 응답(Response)으로 구성되어 있습니다. HTTP 요청/응답 메세지는 HTTP 헤더와 HTTP 본문으로 이루어져있습니다. 1. HTTP 헤더 : HTTP 본문 및 요청/응답에 대한 정보를 포함합니다. 해당 메세지가 제공하는 기능에 대한 최소한의 정보가 정리된 요..

[스프링부트] PostApiControllerTest.java (게시글 등록)

Posts.java (Entity 클래스) PostsRepository.java PostSaveRequestDto.class (web -> dto) PostsService.java (서비스) PostsApiController (컨트롤러) 등록하기 테스트 @Test public void Posts_등록된다() throws Exception{ //given String title="title1"; String content="content1"; PostSaveRequestDto requestDto=PostSaveRequestDto.builder() .title(title) .content(content) .author("author") .build(); String url="http://localhost:"..

[스프링부트] @Autowired와 private final 차이점

책을 읽으며 따라하다 보니까 의문이 생겼습니다. 어떤 클래스에서는 @ Autowired를 쓰고, 또 어떤 클래스에서는 private final을 이용해서 의존성을 주입하고,, 둘의 차이가 궁금해졌습니다. 일단 스프링 프레임워크에서 의존성을 주입하는 방식은 총 3가지 입니다 . private final (생성자 주입 : Constructor Injection) > 생성자 기반 DI @Autowired ( 필드 주입 : Field Injection) > 필드에 자동으로 의존성이 주입됩니다. setter (수정자 주입 : Setter Injection) > 수정자 주입 참고로 @Autowired와 seeter는 필드를 final로 선언할 수 없습니다. 가장 권장하는 방식은 생성자로 주입받는 방식입니다. @Au..

[스프링부트] 순환 참조 문제란?

순환 참조 문제란 정확히 무엇일까요? A 클래스가 B 클래스의 Bean을 주입받고, B 클래스가 A 클래스의 Bean을 주입받는 상황으로 서로 순환되어 참조할 경우, 발생하는 문제입니다. 이 문제가 왜 일어나죠? 필드 주입 방식과 수정자 주입 방식에서는 위 같은 상황이 일어나더라도 애플리케이션 실행 과정에서 예외가 발생하지 않습니다. 당장에는 문제가 생기지 않지만, 문제가 되는 순간은 실제로 해당 메소드가 호출되었을 때 입니다. 하지만 위 상황은 순환참조 문제가 아닙니다. 서로 다른 메소드가 서로 호출을 할 때 생기는 순환호출 문제입니다. 생성자 주입 방식에서의 순환참조 문제에 대해 다뤄보기 전, 생성자 주입 방식의 동작원리에 대해 알아봐야합니다. A클래스가 B클래스를 의존하고, B클래스가 C클래스를 의..