스프링 JPA로 일정 관리 앱 만들기

OneTwo·2025년 2월 13일

스프링 JPA를 사용해서 일정 관리 프로젝트를 진행하였다.

필수 과제

Lv 1. 일정 CRUD

일정 관리에는 작성 유저명,할일 제목,할일 내용,작성일,수정일이 필요하다.
작성일과 수정일은 강의에서 배운 내용대로 BaseEntity클래스를 작성하여
이를 상속받아 공통적으로 관리했다.

Lv 2. 유저 CRUD

유저 관리에는 유저명,이메일,작성일,수정일이 필요하다.
작성일과 수정일은 마찬가지로 BaseEntity를 상속받아 공통적으로 관리한다.

Lv 3. 회원가입

회원가입을 하기 위해서는 이름,이메일,비밀번호를 작성해야한다.
이때 이메일은 unique해야 하며 비밀번호는 데이터베이스에 저장될 때
암호화되어 저장되어야 한다.
이 조건들은 도전과제에서 구현한다.

Lv 4. 로그인

로그인은 세션을 활용해 구현한다.
사용자는 자신의 이메일과 비밀번호를 입력하여 로그인에 성공하면
세션을 발급받게 되고 이는 게시물과 댓글을 작성,삭제,수정할 때
발급받은 세션이 자동으로 넘어가 권한을 확인한다.(인가)

도전과제

Lv 5. 다양한 예외처리 적용하기

Validation을 활용해 예외처리를 하였다.
찾아보니 우선 요청을 보낼 RequestDto에서 조건을 설정해줘야 했다.
@NotBlank 어노테이션을 사용하여 필수적으로 입력값을 작성하도록 하였고
@Email 어노테이션을 통해 이메일 형식을 검증했다.

RequestDto에서 어노테이션을 붙인다고 끝나는게 아니라 controller에서
이 예외들을 처리해줘야 했다.
이 부분이 익숙하지 않았지만 구글링을 통해 해결할 수 있었다.

Lv 6. 비밀번호 암호화

사용자가 회원가입을 하게 되면 사용자 정보가 데이터베이스에 저장된다.
하지만 이때 사용자의 비밀번호는 암호화 되지 않은 상태로 그대로 저장되게 된다.
이는 이후에 보안상 큰 문제를 초래할 수 있다.
이를 방지하고자 사용자의 비밀번호는 반드시 암호화하여 저장되어야 한다.
비밀번호 암호화는 PasswordEncoder를 사용하여 암호화한다.

implementation 'at.favre.lib:bcrypt:0.10.2'

build.gradle 에 다음과 같은 의존성을 추가한다.

import at.favre.lib.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Component;

@Component
public class PasswordEncoder {

    public String encode(String rawPassword) {
        return BCrypt.withDefaults().hashToString(BCrypt.MIN_COST, rawPassword.toCharArray());
    }

    public boolean matches(String rawPassword, String encodedPassword) {
        BCrypt.Result result = BCrypt.verifyer().verify(rawPassword.toCharArray(), encodedPassword);
        return result.verified;
    }
}

config 패키지에 다음과 같이 코드를 작성하면
비밀번호는 암호화되어 데이터베이스에 저장된다.

Lv 7. 댓글 CRUD

사용자는 생성된 일정에 댓글을 작성할 수 있다.
댓글은 댓글내용,작성일,수정일,유저 고유 식별자, 일정 고유 식별자가 필요하다.
댓글에 유저와 일정 정보가 포함되도록 하기 위해서
사용자와 일정에 다대일 연관관계를 설정하였다.

어려웠던 점이나 느낀점

이번 과제를 진행하면서 JPA의 동작을 더 잘 이해할 수 있게 되었다.
기본적인 CRUD구현은 이제 쉽게 할 수 있게 되었다.
대댓글 기능을 이전에 구현해본적이 있어 이번에도 대댓글 기능을 구현하려고 했으나
시간 관계상 구현하지 못했다.
대댓글 기능을 구현하기 위해서는 대댓글(자식 댓글)은 상위댓글(부모 댓글)의 id가 필요하다.
이후에 대댓글 기능도 추가해봐야겠다.

profile
매일 성장하는 개발자

0개의 댓글