![사이드 프로젝트 [국비의 모든것] - 게시글 삭제 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQi2y6%2FbtsjILvTJVY%2F2j081SXcxxtEkpNTOpZwK1%2Fimg.png)
목차요구사항 분석구현테스트 이번에는 비교적 간단한 게시글 삭제 기능을 개발하여보겠습니다. 위의 게시글 상세보기 화면에서, 빨간색 동그라미를 친 삭제하기 버튼을 눌러봅니다. 위와 같은 Confirm 창이 뜨고, 확인을 누른다면 게시글 삭제 기능을 수행합니다.요구사항 분석게시글 상세보기 페이지에서, 현재 로그인된 사용자와 일치하는 사용자가 게시글 삭제를 요청한다면 게시글을 삭제합니다.게시글 삭제가 완료되면, 삭제된 게시글의 카테고리에 해당하는 게시물 목록 페이지로 이동합니다. 구현- BoardController.java@Slf4j@RestController@RequiredArgsConstructor@RequestMapping("/api/v1/boards")public class BoardApiControll..
![사이드 프로젝트 [국비의 모든것] - 게시글 작성 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnwxCl%2FbtsjGnCLhJz%2FHik2zZnE1g0YnwBk8TPhek%2Fimg.png)
목차UI요구사항 분석기능 구현 여느 커뮤니티 사이트에 있는 필수 기능인 게시글 작성 기능을 개발해보도록 하겠습니다.UI - BoardController.java/** 커뮤니티 작성 폼 */@GetMapping("/community/new")public String boardForm(@ModelAttribute CommunityFormDto form) { return "board/community/communityForm.tiles1";}먼저 /boards/community/new 로 Get 요청시, communityForm.jsp 를 서버사이드 렌더링합니다. 렌더링된 화면은 다음과 같습니다. 요구사항 분석위의 UI를 토대로 요구사항을 정의해보겠습니다.글 작성한 뒤, 간단하게 클라이언트에서 유효성 ..
![사이드 프로젝트 [국비의 모든것] - 게시글 추천, 댓글 추천 기능 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbte4a9%2FbtsjH0Nf1h9%2FEL39IkoCs75zgU9mkKnLIK%2Fimg.png)
목차UI/UX요구사항추천서비스 개발결과 쿼리UI/UX 요구사항추천은 게시글 추천, 댓글 추천을 할 수 있습니다.추천을 한 상태에서 한번 더 추천을 누르면(요청을 한다면) 추천을 취소합니다.추천서비스 개발먼저 요청을 처리하는 LikeController를 만들어 다음과 같은 코드를 넣어줍니다. - LikeController.javaprivate final LikeService likeService;/** 게시글에서 추천 클릭시 처리 API */@PostMapping("/board")public BaseResponse boardLike(@RequestParam Long memberId, @RequestParam Long boardId) { String deleteOrInsert = likeService..
목차계층형 댓글 조회계층형 댓글 조회먼저 CommentsRepository에서 findCommentListByBoardId 메소드를 살펴보겠습니다. - CommentsRepository.java@Query("select c from Comments c join fetch c.member left join fetch c.parent where c.board.id = :boardId order by c.parent.id asc nulls first, c.id asc")List findCommentListByBoardId(@Param("boardId") Long boardId);JPQL을 정리해보면,select cfrom Comments cjoin fetch c.memberleft join fetch c.pa..
![사이드 프로젝트 [국비의 모든것] - 게시글 단건 조회 (1) 조회수 증가, 광고, 이전글/다음글, 해시태그 조회 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjoBT%2FbtsjcaQ3ezg%2FBKoyDJ46eV8gSomsTsYRs1%2Fimg.png)
목차기능 요구사항 분석조회 수 증가광고 조회이전글/다음글 조회해시태그 조회기능 요구사항 분석이번에는 게시글 목록 페이지에서 게시글 하나를 클릭하였을 때 들어갈 수 있는 게시물 상세보기 페이지 백엔드 부분을 개발해보도록 하겠습니다. 먼저 기존에 개발해놓은 게시물 상세보기 페이지 화면은 다음과 같습니다. 화면에 출력할 필요한 데이터게시글 작성자 : 프로필이미지, 닉네임, 활동점수게시글 : 조회수, 제목, 내용, 추천 수, 이전글제목, 이전글번호, 다음글제목, 다음글번호, 댓글목록, 게시물 작성일자댓글 작성자 : 프로필이미지, 닉네임, 활동점수댓글 : 추천 수, 블라인드 설정 여부, 내용, 부모댓글 번호광고 : 광고 이미지 파일명 화면에서는 상위-하위 댓글로만 구성되어있지만 추후 변경될 수 있으므로 계..
![사이드 프로젝트 [국비의 모든것] - 페이징 게시글 목록 조회 기능 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlrMI4%2FbtsjbpU7QB2%2F8g9baV8TuhMn7kjwOiMgyK%2Fimg.png)
목차기능 요구사항 분석요구사항 구현 계획계획대로 구현하기기능 요구사항 분석이번에는 게시판 목록 조회 기능을 개발해보겠습니다. 게시판 목록을 조회했을 시 화면을 먼저 살펴보겠습니다.조회하고자 하는 카테고리에 해당하는 게시물 목록을 조회해야 합니다. 이 때 만약 국비학원 카테고리나 교육과정 카테고리일 경우 기본적인 게시물 데이터 + 추가적인 데이터를 조회해야합니다.검색창에 검색어를 입력한다면, 해당 검색어가 포함된 글제목의 글 목록을 보여주어야 합니다.페이징처리가 되어야 합니다.공지사항 카테고리의 필독 공지사항은 모든 게시물 목록 조회 화면에서 조회해야 합니다.최신순, 댓글순, 추천순, 조회순으로 정렬할 수 있어야 합니다.요구사항 구현 계획해당 기능은 게시판 서비스에서 가장 많은 호출이 일어나는 서비스이므로..
목차기능 요구사항 분석계정 삭제 구현하기기능 요구사항이번엔 계정 삭제 기능을 구현해보도록 하겠습니다. 요구사항은 다음과 같습니다.클라이언트에서 계정 삭제 버튼을 누르면 계정 삭제 API를 호출합니다.계정 삭제 API에서는 회원과 관련된 모든 데이터를 삭제합니다계정 삭제 구현하기일반적인 서비스에서는 계정을 삭제한다면 데이터베이스에 isDeleted 와 같은 컬럼을 두어서 데이터 자체를 삭제하지는 않고, update 처리를 통하여 삭제 처리를 진행한 다음 데이터베이스의 스케줄러 기능을 이용하거나, 스프링 스케줄러를 이용하여 삭제한 시점부터 몇일이 지나게 된다면 삭제되도록 구현하는 방법으로 구현됩니다. 하지만 저는 실제 운영을 해볼 서비스를 개발하는 목적이 아니기 때문에 계정 삭제버튼을 누른다면 회원과 관련된..
목차Member 엔티티 내부에 변경 메소드 만들기FileManager 클래스요청 처리하기 Member 엔티티 내부에 변경 메소드 만들기1편에서 말한 JPA 변경감지를 사용하기 위하여, 엔티티 내부에 변경 메소드를 만들어주도록 하겠습니다.Setter를 통하여 변경감지를 할 수도 있지만, 저는 엔티티에는 Setter를 사용하지 않았습니다. 이유는 엔티티의 필드에 Setter가 있게 된다면 엔티티를 생성하고 저장하기 위하여 값을 주입하는 것인지, 변경감지를 위하여 Setter를 사용하는 것인지 의도를 파악하기 힘들고 어느 부분에서 엔티티의 변경이 일어났는지도 파악하기 힘들기 때문입니다. 반대로 change() 같은 엔티티의 내부 메소드를 사용하게 된다면 메소드 이름을 통하여 개발자의 의도도 직관적으로 파악할 ..
![사이드 프로젝트 [국비의 모든것] - 회원정보 수정 기능 구현 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5wnR%2Fbtsi3qzC7dr%2FthxfI5TpY56S5tuH5ETkC1%2Fimg.png)
목차기능 요구사항변경감지, merge 어떤걸 사용하지?파일 업로드기능 요구사항이번엔 마이페이지에서 회원정보를 수정할수 있도록 하는 기능을 개발해보겠습니다. 1. 회원은 이름, 닉네임, 프로필이미지, 이메일수신동의 여부 상태를 변경할 수 있습니다.2. 기존 이름, 닉네임, 프로필이미지, 이메일수신동의 여부 상태가 변경되어야만 [저장] 버튼을 누를 수 있습니다.3. 프로필이미지를 변경하지 않는다면 이름, 닉네임, 이메일수신동의 여부 상태에 대해서만 변경을 해주어야 합니다.4. 프로필이미지를 변경한다면 서버의 images 폴더에 변경하고자 하는 이미지 파일을 저장해주고 기존 프로필이미지가 기본이미지인 "user.PNG"가 아니라면, 해당 폴더에서 파일을 삭제해줍니다. 변경감지, merge 어떤걸 사용하지?J..
![사이드 프로젝트 [국비의 모든것] - 일반회원가입 기능 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIOJC%2FbtsiuJUJv59%2FtFOKlCIc8EI60khX8FDyok%2Fimg.png)
목차기능 요구사항중복검사 기능 만들기이메일 인증코드 전송하기Google reCAPTCHA v2 적용하기회원 정보 저장기능 요구사항프로젝트에서는 회원의 종류가 일반회원, 교육기관회원, 관리자로 나누어져있습니다.일반회원과 교육기관 회원은 회원가입을 할 수 있는 페이지가 따로 있습니다.어차피 교육기관회원이라고 해봤자 일반회원보다 입력받는 값만 조금 더 있을 뿐이지 기능 구현의 흐름은 일반회원가입과 같기 때문에 일반회원 가입 기능에 대하여만 포스팅하겠습니다. 클라이언트에서 userId 값을 입력시, keyup 이벤트로 서버에 userId 값이 중복되는지 검사요청을 하여 중복된다면 가입을 막습니다.위와 같은 과정은 unique 제약이 있는 필드(userId, nickname, email) 에 대하여 모두 진행합니..
![사이드 프로젝트 [국비의 모든것] - 로그인, 로그아웃 기능 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVyq82%2FbtsizdAKQbG%2FPTbRAFA1xM3mJ2a9XdRg70%2Fimg.png)
목차기능 요구사항로그인로그아웃기능 요구사항이제 구조적인 설계는 대강 끝났으니 로그인 기능과 로그아웃 기능을 개발해보도록 하겠습니다.로그인 기능과 로그아웃에 대한 기획은 다음과 같습니다. 로그인이 필수인 페이지로 이동할 때, 로그인이 되어있지 않는다면 로그인 페이지로 redirect 됩니다. 이 때 로그인이 성공하게 된다면 기존에 보고있던 페이지로 이동하여야 하기 때문에 쿼리파라미터로 redirectURL이 넘어옵니다.기본값은 "/"로 지정하여 넘어온 redirectURL이 없다면 메인 페이지로 이동시킵니다.Login에 실패한다면 LoginException 예외를 발생시킵니다. LoginException은 체크예외를 상속받아 개발자가 무조건 처리하게 합니다.Login에 성공한다면 session에 기본적인 ..
![사이드 프로젝트 [국비의 모든것] - 패키지 구조 설계하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTedi%2FbtsiO6Po5M2%2FGuR40bkhMOTYJwOaT5yGu1%2Fimg.png)
목차기존 프로젝트 패키지 구조개선된 패키지 구조 기존 프로젝트를 진행할 때 가장 의문점이였던 부분중 하나는 패키지 구조가 이게맞나? 라는 부분이었습니다.그도 그럴것이 학원에서 프로젝트를 진행할 때 Github의 충돌을 방지하기 위하여 이름별로 패키지를 나누고 각자 따로 작업을 진행하라고 하였었기 때문이었는데, 아무리 다른 프로젝트의 코드들을 둘러보아도 이름별로 패키지를 나누어 놓은 프로젝트는 찾아볼 수 없었기 때문입니다.먼저, 기존 프로젝트의 패키지 구조는 다음과 같습니다.기존 프로젝트 패키지 구조📦gukmo ┣ 📂board ┃ ┣ 📂aop ┃ ┣ 📂common ┃ ┣ 📂hasol ┃ ┃ ┣ 📂alarm ┃ ┃ ┣ 📂controller ┃ ┃ ┣ 📂repository ┃ ┃ ┗ 📂serv..