diff --git a/src/main/java/com/rest/api/advice/ExceptionAdvice.java b/src/main/java/com/rest/api/advice/ExceptionAdvice.java index 8ff576d..8f40cf5 100644 --- a/src/main/java/com/rest/api/advice/ExceptionAdvice.java +++ b/src/main/java/com/rest/api/advice/ExceptionAdvice.java @@ -26,7 +26,7 @@ public class ExceptionAdvice { @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) protected CommonResult defaultException(HttpServletRequest request, Exception e) { // 예외 처리의 메시지를 MessageSource에서 가져오도록 수정 - return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), getMessage("unKnown.msg")); + return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), getMessage("unKnown.msg")+"("+e.getMessage()+")"); } @ExceptionHandler(CUserNotFoundException.class) diff --git a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java index 35cce6b..46d1b5b 100644 --- a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java +++ b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java @@ -18,7 +18,8 @@ public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException, ServletException { - RequestDispatcher dispatcher = request.getRequestDispatcher("/exception/entrypoint"); - dispatcher.forward(request, response); +// RequestDispatcher dispatcher = request.getRequestDispatcher("/exception/entrypoint"); +// dispatcher.forward(request, response); + response.sendRedirect("/exception/entrypoint"); } } diff --git a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java index 6871f99..9d66841 100644 --- a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java +++ b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java @@ -32,7 +32,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .and() .authorizeRequests() // 다음 리퀘스트에 대한 사용권한 체크 .antMatchers("/*/signin", "/*/signin/**", "/*/signup", "/*/signup/**", "/social/**").permitAll() // 가입 및 인증 주소는 누구나 접근가능 - .antMatchers(HttpMethod.GET, "/helloworld/**","/actuator/health").permitAll() // hellowworld로 시작하는 GET요청 리소스는 누구나 접근가능 + .antMatchers(HttpMethod.GET, "/exception/**", "/helloworld/**","/actuator/health", "/v1/board/*", "/v1/board/*/posts").permitAll() // hellowworld로 시작하는 GET요청 리소스는 누구나 접근가능 .anyRequest().hasRole("USER") // 그외 나머지 요청은 모두 인증된 회원만 접근 가능 .and() .exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler()) diff --git a/src/main/java/com/rest/api/controller/v1/board/BoardController.java b/src/main/java/com/rest/api/controller/v1/board/BoardController.java new file mode 100644 index 0000000..7d3dc3e --- /dev/null +++ b/src/main/java/com/rest/api/controller/v1/board/BoardController.java @@ -0,0 +1,43 @@ +package com.rest.api.controller.v1.board; + +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import com.rest.api.model.board.ParamsPost; +import com.rest.api.model.response.ListResult; +import com.rest.api.model.response.SingleResult; +import com.rest.api.service.ResponseService; +import com.rest.api.service.board.BoardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@Api(tags = {"3. Board"}) +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/v1/board") +public class BoardController { + + private final BoardService boardService; + private final ResponseService responseService; + + @ApiOperation(value = "게시판 정보 조회", notes = "게시판 정보를 조회한다.") + @GetMapping(value="/{boardName}") + public SingleResult boardInfo(@PathVariable String boardName) { + return responseService.getSingleResult(boardService.findBoard(boardName)); + } + + @ApiOperation(value = "게시판 포스트 조회", notes = "게시판의 포스팅 정보를 조회한다.") + @GetMapping(value="/{boardName}/posts") + public ListResult posts(@PathVariable String boardName) { + return responseService.getListResult(boardService.findPosts(boardName)); + } + + @ApiOperation(value = "게시판 글쓰기", notes = "게시판에 글을 작성한다.") + @PostMapping(value="/{boardName}") + public SingleResult post(@PathVariable String boardName, @Valid ParamsPost post) { + return responseService.getSingleResult(boardService.writePost(boardName, post)); + } +} diff --git a/src/main/java/com/rest/api/entity/board/Board.java b/src/main/java/com/rest/api/entity/board/Board.java new file mode 100644 index 0000000..21a0bcc --- /dev/null +++ b/src/main/java/com/rest/api/entity/board/Board.java @@ -0,0 +1,36 @@ +package com.rest.api.entity.board; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor +public class Board { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + @CreationTimestamp + private LocalDateTime createdAt; + @UpdateTimestamp + private LocalDateTime modifiedAt; + + @Builder + public Board(String name) { + this.name = name; + } + + public Post write(String author, String title, String content) { + return new Post(this, author, title, content); + } +} diff --git a/src/main/java/com/rest/api/entity/board/Post.java b/src/main/java/com/rest/api/entity/board/Post.java new file mode 100644 index 0000000..e7a6aa8 --- /dev/null +++ b/src/main/java/com/rest/api/entity/board/Post.java @@ -0,0 +1,34 @@ +package com.rest.api.entity.board; + +import lombok.Getter; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Getter +public class Post { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String author; + private String title; + private String content; + @CreationTimestamp + private LocalDateTime createdAt; + @UpdateTimestamp + private LocalDateTime modifiedAt; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + private Board board; + + protected Post() { + } + + protected Post(Board board, String author, String title, String content) { + this.author = author; + this.title = title; + this.content = content; + } +} diff --git a/src/main/java/com/rest/api/model/board/ParamsPost.java b/src/main/java/com/rest/api/model/board/ParamsPost.java new file mode 100644 index 0000000..983fb2d --- /dev/null +++ b/src/main/java/com/rest/api/model/board/ParamsPost.java @@ -0,0 +1,27 @@ +package com.rest.api.model.board; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotEmpty; + +@Getter +@Setter +@NoArgsConstructor +public class ParamsPost { + @NotEmpty + private String author; + @NotEmpty + private String title; + @NotEmpty + private String content; + + @Builder + public ParamsPost(String author, String title, String content) { + this.author = author; + this.title = title; + this.content = content; + } +} diff --git a/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java b/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java new file mode 100644 index 0000000..7c26a5a --- /dev/null +++ b/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java @@ -0,0 +1,8 @@ +package com.rest.api.repo.board; + +import com.rest.api.entity.board.Board; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BoardJpaRepo extends JpaRepository { + Board findByName(String name); +} diff --git a/src/main/java/com/rest/api/repo/board/PostJpaRepo.java b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java new file mode 100644 index 0000000..386c4e6 --- /dev/null +++ b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java @@ -0,0 +1,11 @@ +package com.rest.api.repo.board; + +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PostJpaRepo extends JpaRepository { + List findByBoard(Board board); +} diff --git a/src/main/java/com/rest/api/service/board/BoardService.java b/src/main/java/com/rest/api/service/board/BoardService.java new file mode 100644 index 0000000..3e463e7 --- /dev/null +++ b/src/main/java/com/rest/api/service/board/BoardService.java @@ -0,0 +1,40 @@ +package com.rest.api.service.board; + +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import com.rest.api.model.board.ParamsPost; +import com.rest.api.repo.board.BoardJpaRepo; +import com.rest.api.repo.board.PostJpaRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class BoardService { + + private final BoardJpaRepo boardJpaRepo; + private final PostJpaRepo postJpaRepo; + + public Board findBoard(String boardName) { + return boardJpaRepo.findByName(boardName); + } + + public List findPosts(String boardName) { + Board board = findBoard(boardName); + return postJpaRepo.findByBoard(board); + } + + private Post getPost(long postId) { + return postJpaRepo.findById(postId).orElse(null); + } + + public Post writePost(String boardName, ParamsPost paramsPost) { + Board board = findBoard(boardName); + Post post = board.write(paramsPost.getAuthor(), paramsPost.getTitle(), paramsPost.getContent()); + return postJpaRepo.save(post); + } +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 3b3316c..cf53549 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,6 +1,6 @@ logging: level: - root: warn + root: debug com.rest.api: debug spring: diff --git a/src/main/resources/i18n/exception_ko.yml b/src/main/resources/i18n/exception_ko.yml index e09b6dd..f94682d 100644 --- a/src/main/resources/i18n/exception_ko.yml +++ b/src/main/resources/i18n/exception_ko.yml @@ -1,6 +1,6 @@ unKnown: code: "-9999" - msg: "알수 없는 오류가 발생하였습니다." + msg: "알수없는 오류가 발생하였습니다." userNotFound: code: "-1000" msg: "존재하지 않는 회원입니다."