이번에는 재난 알리미라는 어플을 만들었다.평소에 바쁜 일상 때문인지 나의 나태함 때문인지 글을 오랜만에 작성하게 되었다.프로젝트 전체적인 정리, 핵심기능을 작성하려 한다. 재난 알리미가 무엇인가? 위와 같이 현재 존재하는 재난 알림은 나의 위치기반으로 한 재난 알림만 받을 수 있기에 지인의 정보도 얻을 수 있도록 하고 싶었다.AED나 대피소와 같은 위치 기반 조회 시스템이 부족하다고 생각했다.인위재난의 경우 빠르게 알아채기 어렵다.이러한 니즈를 해소하기 위해 개발을 시작했다. 서비스의 특징 Spring Security 스프링 시큐리티를 활용하여 로그인을 구현하였다. Security Config더보기@Configuration@EnableWebSecurity@RequiredArgsConstructorpub..
현재 여행 관련 서비스를 제공하는 웹 프로젝트를 진행 중이다. 서블릿과 jsp를 사용하여 틀을 만들었다. 우선 지금까지 만든 정보를 기록하려고 한다. 웹 서블릿과 jsp를 중점으로 플젝을 진행한 적은 처음이라 아직도 어색하고 부족한 부분이 많았다. 그래도 확실히 로우레벨로 개발을 하다 보니 기초가 많이 늘었다고 생각한다. 이후 이걸 프레임워크를 사용하여 더욱 발전시킬 생각이다. 프로젝트 내용이 많아서 전체적으로 요약하며 설명할 예정이다. 주요 기능 header와 footer를 사용하여 중복되는 화면을 재사용하였다. 다른 jsp에서 include를 사용하여 그대로 가져갈 수 있다. 또한 로그인과 회원가입의 경우 간단하게 modal 창을 사용하였다. 이전 프로젝트는 백엔드만 맡아서 진행하였기에 검증의 경우도..
페이징 최적화를 진행해 보았다. 페이징 최적화에는 크게 두 가지 방법이 있다. NoOffset과 커버링 인덱스를 사용하는 방법이 존재한다. 이번에 프로젝트에서 게시글과 댓글의 페이징 최적화를 진행하였는데, 이 글은 게시글에 관해서만 작성할 예정이다. 일반적인 페이징 쿼리 기존의 코드는 아래와 같았다. public interface BoardRepository extends JpaRepository { Page findAll(final Pageable pageable); } @Transactional(readOnly = true) public BoardAllResponse findAllBoards(final Pageable pageable) { Page sortedBoards = boardRepositor..
이번에는 GPT를 적용하는 내용을 정리할 것이다. openAi를 호출하는 것이기에 큰 어려움은 없다. https://www.baeldung.com/spring-boot-chatgpt-api-openai Using OpenAI ChatGPT APIs in Spring Boot | Baeldung Learn how to use the API of OpenAI ChatGPT in Spring Boot applications. www.baeldung.com 위 내용을 참고하였다. 따라서 중복되는 내용은 생략하여 진행하겠다. Chat @Entity @Table(name = "CHAT") public class Chat extends BaseEntity { @Id @GeneratedValue(strategy = G..
이번에는 Comment API에 관한 내용을 정리할 것이다. 우선 기본적으로 Board아래에 comment가 존재한다. 하지만 확장성을 고려하여 chat이나 다른 여러 comment도 생길 수 있다고 생각하여 만들게 되었다. 이로 인해 새로운 동적테스트도 적용해 보았고, 확장성에 대비하여 코드를 작성하였다. Comment @Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "COMMENT") @DiscriminatorColumn public abstract class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nu..
이번에는 Board API에 관해 정리할 예정이다. 이번 글은 전반적인 코드 설명과 여러 시행착오에 대한 설명을 할 예정이다. Board는 일반적인 게시판과 일치한다. 하지만 코드를 작성할때 컨벤션 및 클린코드를 적용하려 노력하였다. 또한 여러 테스트를 통해 동작을 검증하였고, 그 과정에서 발생한 시행착오를 기록하겠다. Board는 현재 예외에 대한 문서화도 진행되어 있다. Board @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String title; @Column(nullable = false) @Lob ..
오늘은 Member API에 관해 정리할 예정이다. 전반적인 코드 설명과 구조 변경에 대한 설명을 할 예정이다. 기존에 Exception과 Advice를 전부 묶어서 관리하였다. 그 결과 각자 개발 후 머지를 하는 과정에서 conflict이 자주 발생하였다. 또한 예외가 많아질수록 관리하기 어렵다는 의견도 많았다. 따라서 도메인별로 예외를 관리하도록 하였다. Member API는 현재 간단하게 되어있다. 추후 추가될 예정이지만 현재는 Member 조회와 비밀번호 변경이 만들어져 있다. Member @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullab..
방학 동안에 프로젝트를 진행하기로 하였다. chat ai를 사용하여 대학생들에게 여러 정보를 전달해 주는 등 여러 기능을 추가할 생각이다. 이 프로젝트는 실제 서비스를 할 생각이기에 꼼꼼하게 코드를 작성하고 서로 리뷰를 할 생각이다. 또한 서비스를 통해 트래픽을 받아보는 경험을 할 수 있을 것이라 생각된다. 각자 맡은 파트가 있기에 초반 Auth 구조의 경우 내가 개발을 하지는 않았지만 이 프로젝트를 통해 서로 모두 공부의 목적도 있기에 모든 코드를 이해하고, 분석하며 코드리뷰를 진행했다. 또한 컨벤션을 정하여 이를 기준으로 작성하기로 하였다. 코드의 통일성 및 가독성을 위한 선택이다. Merge도 매우 신중하게 진행되며, 코드리뷰를 2인 이상 받아야지만 Merge가 가능해진다. 또한 백엔드의 경우 Lo..
이번에는 도메인 테스트를 추가하였다. 원래 컨트롤러와 서비스단위에서만 테스트코드를 작성하였는데, 도메인도 추가하였다. 도메인 내에 있는 메서드를 테스트하였다. 코드가 너무 많기 때문에 가장 코드가 길고, 복잡한 Board를 주로 설명하겠다. 기존의 Board이다. Board @Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Board extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "board_id") private Long id; @Column(..
이번에는 계층형 카테고리를 추가하였다. 예를 들어 현재 내 티스토리 블로그와 같은 모양을 생각하고 만들었다. 고민한 점은 모든 게시글이 카테고리를 가지고 있는 것이 맞을까 라는 생각이었다. 따라서 굳이 카테고리에 넣지 않아도 되도록 만들었다. 중요한 부분위주로 설명하겠다. Category @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Long id; @Column(nullable = false) private String n..