TIL(Today I Learned)

[TIL] 일정 관리 앱 만들기 & 기능 구현 develop

jy3574 2024. 11. 18. 23:16
프로젝트 요약

 

1. 프로젝트 목적

  • 일정관리 앱 개발을 통해, RESTful API 설계 및 JPA 기반 CRUD 구현(데이터베이스 관리), 데이터 검증, 인증 기능 학습
  • Cookie/ Session 을 활용한 인증/인가 로직 학습과 데이터 유효성 검증
  • 데이터 검증 및 비지니스 로직 분리로 유지보수성 연습
  • 기본적인 보안 개념과 인증 매커니즘을 명확히 이해

2. 프로젝트 구현 단계

<필수 기능>

  • Lv0 : 프로젝트 설계
    • API 명세서 작성 : postman 사용
    • ERD 작성 
    • SQL 작성 : root 경로에 schedule.sql 만들어서 작성
  • Lv1 : 일정 CRUD
    • 일정 저장, 조회, 수정, 삭제 기능 구현
    • 일정 필드
      • 작성 유저명, 할일 제목, 할일 내용, 작성일, 수정일
      • 작성/수정일 필드는 JPA Auditing 활용해서 적용
  • LV2 : 유저 CURD
    • 유저 저장, 조회, 삭제 기능 구현
    • 유저 필드
      • 유저명, 이메일, 작성일, 수정일
      • 작성/수정일 필드는 JPA Auditing 활용해서 적용
    • 연관관계 구현
      • 일정은 이제 작성 유저명 필드 대신 유저 고유 식별자 필드를 가진다.
  • Lv3 : 회원가입
    • 유저에 비밀번호 필드를 추가
      • 단, 비밀번호 암호화는 도전 기능에서 수행
  • Lv4 : 로그인(인증)
    • 키워드 : 인터페이스
      • HttpServletRequest / HttpServletResponse : 각 HTTP 요청에서 주고 받는 값들을 담고 있다.
    • 설명
      • Cookie / Session 을 활용해 로그인 기능 구현
      • 필터를 활용해 인증 처리
      • @Configuration을 활용해 필터 등록
    • 조건
      • 이메일과 비밀번호를 활용해 로그인 기능을 구현
      • 회원가입, 로그인 요청은 인증 처리에서 제외
    • 예외처리
      • 로그인 시 이메일과 비밀번호가 일치하지 않을 경우 401 반환

<도전 기능>

  • Lv5 : 다양한 예외처리 적용하기
    • Validation을 활용해 다양한 예외처리 적용
    • 프로젝트를 분석하고 예외사항 지정
      • ex. 할일 제목은 10글자 이내, 유저명은 4글자 이내
      • @Pattern을 사용해서 회원가입 Email 데이터 검증 등(정규표현식 적용)
  • LV6 : 비밀번호 암호화
    • Lv3에서 추가한 비밀번호 필드에 들어가는 비밀번호를 암호화
      • 암호화를 위한 PasswordEncoder를 직접 만들어 사용
  • Lv7 : 댓글 CRUD
    • 생성한 일정에 댓글을 남길 수 있음
      • 댓글과 일정은 연관관계를 가진다.
    • 댓글 저장, 조회, 수정, 삭제 기능 구현
    • 댓글 필드
      • 댓글 내용, 작성일, 수정일, 유저 고유 식별자, 일정 고유 식별자
      • 작성/수정일 필드는 JPA Auditing 활용해서 적용
  • Lv8 : 영속성 전이를 활용한 삭제
    • 유저를 삭제할 때 해당 유저가 생성한 일정과 댓글도 삭제
      • 이때, JPA의 영속성 전이 기능을 활용
  • Lv9 : 일정 페이징 조회
    • 데이터베이스
      • offset/ limit : SELECT 쿼리에 적용해서 데이터를 제한 범위에 맞게 조회
    • 페이징
      • Pageable : Spring Data JPA에서 제공되는 페이징 관련 인터페이스
      • PageRequest : Spring Data JPA에서 제공되는 페이징 요청 관련 클래스
    • 일정을 Spring Data JPA의 Pageable과 Page 인터페이스를 활용하여 페이지네이션을 구현
      • 페이지 번호, 페이지 크기를 쿼리 파라미터로 전달하여 요청하는 항목 구현
      • 할일 제목, 할일 내용, 댓글 개수, 일정 작성일, 일정 수정일, 일정 작성 유저명 필드를 조회
      • 디폴트 페이지 크기 : 10
    • 일정의 수정일을 기준으로 내림차순 정렬

사용한 기술 및 개념

 

1. Backend : Spring Boot, Spring Data JPA

  • Spring Boot
    • 스프링 프레임워크를 기반으로 한 애플리케이션 개발 플랫폼
    • 내장 서버(Tomcat)를 사용하여 빠르게 애플리케이션을 실행 가능
    • RESTful API 설계 및 계층 분리(Controller, Service, Repository) 구조 지원
  • Spring Data JPA
    • JPA(Java Persistence API)를 더 쉽게 사용할 수 있도록 도와주는 스프링 모듈
    • 데이터베이스와의 상호작용을 위한 기본적인 CRUD 메서드 제공(findAll, save, delete)
    • Entity, DTO를 사용해 관계형 객체 매핑 처리

2. Database : MySQL

  • MySQL
    • 관계형 데이터베이스 관리 시스템(RDBMS)
    • SQL(Structured Query Language)을 사용해 데이터베이스 CRUD 가능
    • 일정관리 프로젝트에서 일정, 유저, 댓글의 데이터 저장 및 연관 관계 설정에 사용

3. Tool : Postman(API test), IntelliJ IDEA, ERD(DB diagram)

  • Postman
    • API 요청 & 응답 테스트 도구
    • 프로젝트에서 구현한 RESTful API를 테스트하고 상태 코드(200, 404 등)와 응답 데이터 확인
  • IntelliJ IDEA
  • ERD
    • 데이터베이스 설계 시 Entity 간의 관계를 시각적으로 표현

직접 구현한 내용
구현 o : Lv 1,2,3,4,5(정규식 제외),7
구현 x : Lv 5(정규식),6,8,9

 

1. Lv0 : 프로젝트 설계

1-1. API 명세서 작성(postman 사용)

https://documenter.getpostman.com/view/39376424/2sAY55ayAZ

 

Schedule Develop

The Postman Documenter generates and maintains beautiful, live documentation for your collections. Never worry about maintaining API documentation again.

documenter.getpostman.com

 

1-2. ERD 작성

 

1-3. SQL 작성

 

2. Lv1 : 일정 CRUD

  • 구현 내용
    • API로 일정 생성, 조회, 수정, 삭제 구현
    • 작성일, 수정일은 JPA Auditing 기능으로 자동 관리
    • 서비스 계층에서 비즈니스 로직을 분리하여 유지보수성 높임
  • 사용 기술
    • @Entity 등 JPA 주요 어노테이션
    • DTO를 활용하여 데이터 전송 캡슐화
  • 학습한 내용
    • 3-Layer Architecture 구조를 설계하여 계층별 역할 분리
    • Validation 사용을 통해 데이터의 무결성 학습

3. Lv2 : 유저 CRUD

  • 구현 내용
    • 유저 생성, 조회, 삭제 기능 구현
    • 유저 고유 식별자를 부여하여 유저와 일정 간의 연관관계 설정
    • 작성일, 수정일은 JPA Auditing 기능으로 자동 관리
  • 사용기술
    • JPA Entity 설계 및 기본 CRUD 메서드 활용(ex. save, findById, delete)
    • @Id, @GeneratedValue 등의 JPA 어노테이션을 활용
  • 학습한 내용
    • DTO 설계를 통해 데이터 전송 구조를 효율화
    • HTTP 상태코드(OK 등)를 활용한 적절한 응답 반환 학습

4. Lv3 : 회원가입

  • 구현 내용
    • 회원가입 API 구현
    • 비밀번호는 암호화하지 않고 저장, 도전과제에서 암호화 구현
    • 새로운 유저 생성 : 이름, 이메일, 비밀번호 필드를 포함
  • 사용기술
    • Controller : @PostMapping 요청 어노테이션을 활용해 HTTP 요청을 처리
    • JPA를 통해 데이터베이스에 회원 정보 저장
    • 저장 완료 후 DTO를 통해 생성된 회원 정보를 클라이언트에 반환 (201 CREATED)
  • 학습한 내용
    • HTTP 상태 코드를 활용해 RESTful API 설계 원칙을 학습
    • save 메서드를 사용해 회원 정보를 데이터베이스에 저장

 

5. Lv4 : 로그인(인증)

  • 구현 내용
    • 로그인 API 구현
    • 로그인 성공 시 SESSIONID 쿠키를 생성하여 클라이언트에 전달
    • 로그인 Filter를 통해 쿠키 생성 이후 모든 요청에서 유효성 확인
    • 이메일과 비밀번호가 일치하지 않을 경우 401 Unauthorized 상태 반환
    • 인증 필터는 회원가입 및 로그인 요청은 제외하고 나머지 API 요청에서 SESSIONID 유효성 검사
  • 사용기술
    • @Configuration을 활용하여 FilterRegistrationBean으로 필터 등록
    • Filter와 FilerRegistrationBean : 요청 - 응답 흐름에서 인증 처리
  • 학습한 내용
    • @Configuration을 활용한 필터 등록과 관리
    • Filter와 FilterChain을 활용한 요청/응답 흐름 제어
    • 쿠키/세션 기반 인증 설계의 구현 이해

6. Lv5 : 다양한 예외처리 적용하기(정규식 제외하고 구현)

  • 구현 내용
    • Validation 어노테이션인 @Valid, @NotBlank, @Size 등을 활용해 입력값 검증
    • @ResponseStatusException으로 예외 상황을 명확히 정의
  • 주요 예외 처리
    • 입력값이 Null이거나 값이 잘못된 경우
    • 비밀번호 불일치 할 경우 인증 실패
    • 잘못된 ID로 데이터를 조회하거나 삭제하려는 경우
  • 학습한 내용
    • 서비스 계층에서 예외처리 로직을 사용
    • Validation을 통해 데이터 무결성을 보장하고 안정적인 애플리케이션 구현

7. Lv7 : 댓글 CRUD

  • 구현 내용
    • 댓글 생성, 조회, 수정, 삭제 기능 구현
    • 댓글과 유저&일정 간 @ManyToOne 연관관계 설정
  • 사용기술
    • JPA 연관 관계 매핑 : @ManyToOne, @JoinColum
    • LAZY Fetch를 활용해 불필요한 데이터 로드 방지
  • 학습한 내용
    • 연관 관계 설계 시 데이터 로드의 효율성과 여러 문제를 고려해서 설계해야한다는 것을 체감
    • DTO 와 Entity 간의 변환 로직 구현 학습

진행 중 어려웠던 점과 해결 방법
& 피드백

 

1. 비밀번호 암호화 기능 구현

-구현하지 않을 시 문제 : 비밀번호를 암호화하지 않을 시 보안에 취약함.

-해결 방법 :  암호화 라이브러리를 사용해 비밀번호를 안전하게 저장하고, 로그인 시에도 비교 가능하도록 개선

-어려운 점 

  • bcrypt 의존성 추가하는 방법을 잘 모르겠음
  • PasswordEncoder 클래스를 사용했을 때, 비밀번호를 암호화하는 매서드를 사용하는 방법이 어려움
  • Member Entity에 암호화된 비밀번호를 저장하는 방법을 모르겠음

==구현하지 못함, 이후에 구현하게 된다면 다시 내용정리

 

2. 진행 중 문제점과 해결방법은 트러블 슈팅을 작성해 정리

https://jy3574.tistory.com/87

 

[내일배움캠프/백엔드] Spring 숙련 개인과제 일정 관리 앱 develop 트러블 슈팅

- 어떤 현상을 발견했는가?1. deleteSchedule 반환 타입 오류 2. Entity 이름 중복 3. Auditing 설정 문제  이런 장애가 생길 수 있다는 것을 인지1. deleteSchedule 반환 타입 오류-deleteSchedule은 삭제 메소드이

jy3574.tistory.com

 

3. 피드백

 

-MemberController : 유저 수정 기능 미구현

  • 개선 방법
    • @PutMapping을 사용해 회원 정보를 수정할 수 있는 API 추가
    • DTO를 사용해 수정 가능한 필드만 업데이트
  • 기능 구현을 한 후에 빠진 것이 없는지 체크하는 습관을 가지기

-Login에서 GlobalExceptionHandler 적용

  • 피드백 내용
    • 로그인 실패 시 컨트롤러에서 try-catch로 예외처리를 하고 있는데 코드 가독성이 떨어짐
  • 개선 방법
    • GlobalExceptionHandler를 적용하여 로그인 실패와 같은 예외를 관리 -> 코드 가독성 증가
    • ResponseStatusException 대신 커스텀 예외 클래스 활용

-LoginFilter : White List 구현

  • 피드백 내용
    • Cookie를 활용한 인증을 사용하고 있는데, 회원가입이나 로그인 요청은 인증이 필요하지 않기 때문에 White List를 만들어 특정 요청은 인증을 생략
  • 개선 방법
    • White List를 구현하여 로그인이나 회원가입 요청 등은 필터를 통과하도록 설정
    • ReqyestURI로 요청 URI를 확인 후 White List에 포함 된 경우 필터를 건너뛰도록 구현해보기

-CommentController : REST 규약 수정

  • 피드백 내용
    • @GetMapping("/schedule/{scheduleId}")의 URL이 REST 규약에 어긋남
    • REST 규약에 따르면 큰 도메인 -> 작은 도메인 순으로 작성해야 함
  • 개선 방법
    • URL을 /schedule/{scheduleId}/comments로 수정
    • @RequestMapping을 수정하여 컨트롤러의 URL 구조를 간결하게 변경하는 방법도 있음

느낀 점 및 개선해야 할 점

 

일정 관리 앱을 JPA 방식으로 다시 만들어 보면서 프로젝트를 진행할 때 단계별로 나누어서 개발하는 것이 얼마나 중요한지 다시 한번 깨닫게 되었다. 단계별로 나누어서 개발함으로써 세분화 된 기능을 구현할 수 있었고, 어디서 문제가 발생하는지 단위 별로 알게 되어 코드를 짤 때 어떤 부분을 고려해야하는지에 대해서도 한번 더 생각해보게 되었다.

 

또, 저번 과제에서는 모든 코드를 짜고 난 뒤에 테스트를 했었는데 그 부분을 생각하고 이번에는 각 단계에서 postman을 활용하여 API 테스트를 계속 해본 것이 코드를 짜는데 큰 도움이 된 것 같다. 코드를 잘 짰더라도 경로가 다르거나, 아니면 코드가 실행은 되었는데 문제가 있다던가 등의 예상치 못한 에러를 발견하는데 도움이 되었고, 이를 통해 수정하는 것도 전보다는 조금 더 간편했던 것 같다.

 

그리고 처음 사용해보는 로그인, 세션, 쿠키 등의 내용을 통해 API 보안을 알고 이해하게 되었고, 비밀번호 암호화 기능을 구현하지는 못했지만 다음번에는 더 강화된 보안 기능을 적용할 수 있게 공부를 열심히 해야겠다고 다짐하게 되었다. 또한 GlobalExceptionHandler 같은 경우는 저번 과제에서도 해결을 하지 못한 부분인데 반복적으로 발생하는 예외를 처리하는 공통 로직을 분리하는 방법에 대해 공부를 해봐야겠다.

 

코드를 짜면서 제일 헷갈렸던 부분 두가지가 White List와 RESTful 원칙인데, 먼저 White List의 경우 인증이 불필요한 요청을 필터에서 제외하여 불필요한 인증 처리와 관련된 문제를 해결하고 특히 로그인이나 회원가입과 관련된 요청은 불필요한 요청이므로 White List를 사용해야한다. 사용하는 방법에 대해 조금 더 공부하면 적용할 수 있을 것 같다. 두번째고 RESTful URL 설계 원칙인데 이를 사용하면 일관성을 유지할 수 있고, API 사용자가 쉽게 이해할 수 있다는 장점이 있다. 조금 더 지키려고 노력해봐야겠다.