맞는데 왜 틀릴까..?

Spring Boot 17

[Spring Security] Form 인증 방식

Spring Security에서 Form 인증 방식은 세션과 쿠키를 함께 사용한다. 로그인에 성공하면, Spring Security는 사용자 정보를 기반으로 인증된 세션을 생성한다. 이 세션은 일반적으로 서버 측에 저장되며, 해당 사용자가 로그인한 동안 유지된다. 이 세션 ID를 클라이언트 측에 쿠키로 전송한다. 클라이언트 측에서는 다른 요청을 보낼 때마다 쿠키에 저장된 세션 ID를 서버에 전송하고, 서버는 이를 사용해 해당 세션을 식별한다. 📌세션 서버 측에서 클라이언트의 정보를 저장하는 방식으로, 클라이언트가 최초로 서버에 요청을 보내면 서버는 그 클라이언트를 위한 고유한 세션 ID를 발급하고, 이 ID를 쿠키 등을 통해 클라이언트에게 전송한다. 클라이언트는 이 세션 ID를 가지고 서버에 요청을 보낼..

[Spring Security] 기본 / 사용자 정의 보안 기능 구현

Spring Security는 form 인증 방식과 jwt 토큰 인증 방식 모두 제공한다. form 인증 방식은 비교적 쉽게 구현할 수 있을 것 같지만 내 기억으로는 보안에 취약했던 것 같다. 그래서 작년 DRF로 개발을 진행할 때 JWT 토큰 인증 방식을 구현했었는데 로그아웃 부분이 상당히 까다로워서 고생했던 기억이 있다. 과연 Spring Security는 어떨까? 일단 Spring Security에는 여러 가지 상속 클래스가 있는데 클래스 명이 매우 길고 다양하다. 따라서 클래스 명에 붙은 의미를 먼저 이해해 보자. 지극히 글쓴이 관점으로 나눈 것이기 때문에 틀릴 수 있는 분류입니다. Filter Web Application에서 Filter는 HTTP 요청을 가로채어서 처리하는 컴포넌트로, HTTP..

[Spring Boot] 댓글 기능 Rest API

댓글 구조 ManyToOne ManyToMany.. 게시글의 id -> pk (primary key) 댓글에서 게시글의 id와 연결한 값 -> fk (foregin key).. DB DB에 질문글을 의미하는 article 데이터를 등록한 후, 각 질문의 id를 foregin key로 하는 댓글을 등록한다. Entity getter는 지양하는 게 좋지만 일단 편의상 @Getter 어노테이션을 사용했다. 각 게시글을 의미하는 Comment 엔티티를 생성하자. 질문 글 Article 엔티티에 대하여 ManyToOne 연결을 하고 article_id를 FK로 설정한다. @JoinColumn @JoinColumn 어노테이션은 연결될 외래키(FK)에 대한 정보를 지정한다. 여기서 name 속성은 외래키의 이름을 지..

Spring Boot 2023.03.18

[Spring Boot] 테스트 코드 작성

스프링 부트는 테스트 환경을 쉽게 구축하고 테스트를 실행하는데 필요한 다양한 기능을 제공한다. @Test 어노테이션을 사용하면 쉽게 테스트 환경을 활용할 수 있다. 다양한 입력값이나 예외 처리애 대한 테스트 케이스를 작성하고 실행하면서 버그를 빠르게 찾아내고 디버깅해 보자. 테스트하고 싶은 메서드에서 우클릭 후 Generate -> Test를 클릭하면 test 디렉토리의 service 파일에 해당 메서드가 생성된다. 본체의 ArticleService를 사용해야 하니 의존성 주입을 해주고, @SpringBootTest 어노테이션을 달아주자. 현재 DB에 있는 데이터들과 test에서 새로 작성한 데이터들을 비교하는 코드이다. DB에 저장되어 있는 데이터와 같게 입력했기 때문에 성공한 모습이다. 일부러 실패할..

Spring Boot 2023.03.18

[Spring Boot] Transaction

스프링 부트에서 Transaction은 데이터베이스 작업을 수행하는데 필요한 일련의 작업들을 하나의 논리적인 작업 단위로 묶어서 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)을 보장하는 것을 말한다. Transaction은 다수의 데이터베이스 작업을 하나의 논리적인 작업으로 묶어서, 모두 성공하면 DB에 반영하고, 하나라도 실패하면 모든 작업을 취소(롤백)하여 데이터 일관성을 유지한다. 스프링 부트에서 @Transactional 어노테이션을 사용해 Transaction을 설정할 수 있다. 이를 통해 데이터베이스의 일관성을 유지하고, 예외가 발생하는 경우 롤백하도록 설정할 수 있다. 예를 하나 들어보자. 사용자가 인터넷 쇼핑몰에서 5만..

Spring Boot 2023.03.17

[Spring Boot] Service

스프링 부트에서의 Service는 비즈니스 로직을 구현하는 클래스다. 이러한 Service는 Controller와 Repository 사이에서 데이터를 처리하고, 중개자 역할을 수행한다. Service는 Repository를 주입받아 DB와 상호작용을 처리하며 이를 바탕으로 비즈니스 로직을 수행한다. Controller와 달리 Service는 직접 HTTP 요청을 처리하지 않고 데이터를 처리하는 것에 초첨을 둔다. 따라서 Service에서 데이터를 처리하여 Controller에 리턴해주면 Controller가 HTTP 요청을 처리한다. 앞서 작성했던 RestAPI를 Service 클래스를 구성하여 변경해보자. Service 클래스 생성 service package를 생성한 후 ArticleService ..

Spring Boot 2023.03.17

[Spring Boot] Rest API

Rest API 일반 Controller와 RestController의 차이? Controller는 view 템플릿 페이지를 return RestController는 데이터를 return (문자열, JSON) 일반 Controller에서도 @ResponseBody 어노테이션을 사용하여 JSON 형태의 데이터를 반환할 수 있다. Get 요청 ArticleApiController 클래스에서 ArticleRepository 객체를 직접 생성하지 않고, 외부에서 받아오는 의존성 주입을 사용하였다. 이를 통해 ArticleApiController 클래스와 ArticleRepository 클래스 간의 결합도를 낮추고, 후에 ArticleRepository 클래스의 구현체를 변경해도 ArticleApiControll..

Spring Boot 2023.03.17

[Spring Boot] 데이터 삭제하기

데이터베이스에 있는 정보를 삭제해 보자! 일단 show.mustache에서 삭제 버튼을 만든다. Controller 원래 게시글을 지워야 하므로 @DeleteMapping을 사용해야 하지만 delete 기능을 제공해 주지 않아 @Getmapping을 사용했다. url에서 삭제 대상의 id를 가져온 후 Entity에 담는다. 해당 Entity가 있다면 삭제 시켜주자. 삭제가 완료되면 delete complete라는 메시지를 띄워보자 리다이렉트 된 화면을 보여주는 index.mustache에 해당 msg 필드를 추가해 주면 된다 성공이다!! 딱히 더 공부할만한 내용이 없네요

Spring Boot 2023.03.15

[Spring Boot] 데이터 수정하기

Update인 Patch/Put이지만 form 태그는 patch를 제공하지 않아 실습에서는 post를 사용하였다. articles/show.mustache 먼저 저장된 데이터를 확인할 수 있는 show페이지에서 edit 버튼을 만들어 주자. articles/edit.mustache edit.mustache는 수정할 데이터를 보여준다. new.mustache를 조금 수정하여 작성했다. action = /articles/update로 하고 폼태그는 patch를 제공하지 않아서 post로 작성 id 값을 hidden으로 숨겨서 같이 전송. input 태그에 controller를 통해 가져올 title과 content를 보이게 해 주도록 작성하자. back버튼을 만들어 뒤로 돌아갈 수 있게 해주자. edit C..

Spring Boot 2023.03.14