처음부터 차근차근

프로젝트 설명 본문

프로젝트/한복소개사이트(Spring)

프로젝트 설명

_soyoung 2022. 12. 10. 18:44
반응형

프로젝트 명 : 한보고

기술스택 : Spring boot, JPA, Spring Security

기간 : 2022-09-29 ~ 진행 중

사용한 툴 : intellij

맡은 부분 : 로그인과 로그아웃 구현, 공지사항 REST API, 예외처리 등등

버전관리 : https://github.com/Kim-ggum/Hanbok-Info/tree/ksy

노션 : https://large-hyena-d25.notion.site/99f6f38e65c144df9652562312d476c8

 

설명 : 한복에 대해서 소개하고, 한복 대여소의 위치 정보를 알 수 있는 사이트.

팀원들과 현재 진행상황, 코드 부가 설명 등의 의사소통을 할 때 노션을 사용했습니다.

Spring Security를 사용해서 로그인, 로그아웃 부분을 구현했고, JUnit을 사용해서 테스트 주도 개발을 했습니다.

http 메소드를 사용해서 기본적인 REST API를 구현했고,

공지사항 쪽 예외처리를 공들여 작성했으며, OOP에 주의하며 최대한 재사용 가능하게 개발하도록 노력했습니다.

 

 

직접 작성한 코드 간단 설명

공지사항 REST API 

기본적인 공지사항 CURD 부분입니다. 

GET, POST, PUT, DELETE 매핑을 이용해서 REST API를 만들었고, JPA의 Pageable을 사용해서 페이징 처리를 했습니다.

 

 

이미지 업로드

CKEditor view
CKEditor Javascript 코드

이미지 업로드는 위지윅 에디터인 CKEditor을 이용해서 실시간 이미지 업로드를 개발했습니다.

가장 최신 버전의 CKEditor5를 이용했고, 아래는 서버 단의 이미지 업로드 코드 입니다.

서버 단 이미지 업로드 코드

이미지는 MultipartFile List로 받아서 여러개의 이미지를 한 번에 업로드 할 수 있게 했고, 

UUID 클래스를 이용해서 이미지 파일에 새로운 이름을 부여하여 저장했습니다.

 

 

로그인, 로그아웃

로그인과 로그아웃 부분은 Spring Security를 사용해서 개발했습니다.

UserDetails 인터페이스를 이용해서 form 로그인 하는 방식으로 구현했고, 로그인 실패시 로그인 실패 핸들러를 호출해 에러 메세지를 초기화시켰습니다.

Spring Security Congifure 코드

위 코드는 Spring Security 설정파일 입니다.

form에 있는 아이디와 패스워드 태그의 name값을 커스텀했고, 로그인에 실패시 로그인 실패 핸들러를 호출하게 설정했습니다.

 

로그인 실패 핸들러
로그인 실패시 에러 메시지

위 코드는 로그인에 실패했을 때 호출되는 핸들러 입니다.

생긴 Exception에 맞춰 에러메세지를 대입하고, 세션 처리해서 다시 로그인 페이지로 redirection 시켰습니다.

 

 

유저 권한 enum형으로 저장

유저의 권한 부분은 String이나 숫자로 저장하지 않고, enum형을 이용해서 저장했습니다.

권한 이름은 Spring에서 제공하는 이름을 따랐습니다.

Member 클래스
Role enum
role 저장 컨버터

권한이 enum형이라 db에 저장할 때 형변환시켜서 저장했어야 했는데 저는 AttributeConverter을 이용하는 방식을 사용했습니다.

유저의 권한(enum형)을 db에 저장할땐 convertToDatabaseColumn을 이용해서 숫자로 저장하게 했고,

반대로 db에서 가져올 땐 convertToEntityAttribute를 이용해 숫자를 다시 enum형으로 변환해서 저장했습니다.

 

 

JPA auditing 사용

BaseEntity 만들어서 생성날짜, 수정날짜가 자동 대입되게 개발했습니다.

BaseEntity 클래스
BaseEntity 상속한 모습

 

 

테스트 주도 개발(TDD)

저는 이 프로젝트를 할 때 테스트 주도 개발을 해서 코드의 품질을 높였고, 

실패 코드와 성공 코드를 작성한 후 통과되면 그 후에 실제 서비스 코드를 작성하는 방식으로 개발했습니다.

JUnit의 MockMvc와 Mockito를 사용해서 가짜 객체(Mock 객체)를 만들어서 단위 테스트를 했고, 

로그인, 로그아웃, Controller, Service, Entity 등을 테스트했습니다.

테스트 코드가 너무 많은 관계로 대표적인 코드만 올렸습니다.

로그인, 로그아웃 테스트 코드1
로그인, 로그아웃 테스트 코드2
NoticeController 테스트 코드

 

 

예외처리

custom exception을 만들어서 try catch 문으로 예외를 잡고, ControllerAdvice로 예외를 처리하는 방식을 사용했습니다.

NoticeSevice 클래스 : try catch문 사용
custom exception

Crud 실패 exception을 하나만 만들어서 메세지를 초기화하는 방식으로 exception을 재사용했습니다.

 

Controller advice

이런식으로 contorller advice안에 custom exception을 핸들링하는 함수를 만들어서 에러 메세지와 상태코드를 담아 에러 페이지를 반환하는 방식으로 개발했습니다.

 

에러 담을 때 사용한 클래스
에러 페이지
에러 페이지 결과

이런식으로 OOP를 생각하면서 에러 페이지를 재사용했습니다.

 

 

 

반응형
Comments