From dac4f282e3969dbd3947cffe87f10ad2abe74cf4 Mon Sep 17 00:00:00 2001 From: kimyonghwa Date: Thu, 9 May 2019 13:56:27 +0900 Subject: [PATCH 1/4] Develop board --- .../com/rest/api/advice/ExceptionAdvice.java | 2 +- .../CustomAuthenticationEntryPoint.java | 5 ++- .../security/SecurityConfiguration.java | 2 +- .../controller/v1/board/BoardController.java | 43 +++++++++++++++++++ .../java/com/rest/api/entity/board/Board.java | 36 ++++++++++++++++ .../java/com/rest/api/entity/board/Post.java | 34 +++++++++++++++ .../com/rest/api/model/board/ParamsPost.java | 27 ++++++++++++ .../com/rest/api/repo/board/BoardJpaRepo.java | 8 ++++ .../com/rest/api/repo/board/PostJpaRepo.java | 11 +++++ .../rest/api/service/board/BoardService.java | 40 +++++++++++++++++ src/main/resources/application-local.yml | 2 +- src/main/resources/i18n/exception_ko.yml | 2 +- 12 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/rest/api/controller/v1/board/BoardController.java create mode 100644 src/main/java/com/rest/api/entity/board/Board.java create mode 100644 src/main/java/com/rest/api/entity/board/Post.java create mode 100644 src/main/java/com/rest/api/model/board/ParamsPost.java create mode 100644 src/main/java/com/rest/api/repo/board/BoardJpaRepo.java create mode 100644 src/main/java/com/rest/api/repo/board/PostJpaRepo.java create mode 100644 src/main/java/com/rest/api/service/board/BoardService.java 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: "존재하지 않는 회원입니다." From 189e741ded5c9d70ecf2c6296f32d7c1abbe84ea Mon Sep 17 00:00:00 2001 From: kimyonghwa Date: Fri, 10 May 2019 02:17:23 +0900 Subject: [PATCH 2/4] Make board --- .../rest/api/controller/v1/board/BoardController.java | 10 +++++----- src/main/java/com/rest/api/entity/User.java | 3 ++- .../java/com/rest/api/service/board/BoardService.java | 5 ++--- src/main/resources/application-local.yml | 2 +- src/main/resources/i18n/exception_ko.yml | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) 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 index cf93c2b..86fde1c 100644 --- a/src/main/java/com/rest/api/controller/v1/board/BoardController.java +++ b/src/main/java/com/rest/api/controller/v1/board/BoardController.java @@ -34,7 +34,7 @@ public class BoardController { return responseService.getSingleResult(boardService.findBoard(boardName)); } - @ApiOperation(value = "게시판 글 리스트", notes = "게시판의 포스팅 정보를 조회한다.") + @ApiOperation(value = "게시글 리스트", notes = "게시글 리스트를 조회한다.") @GetMapping(value = "/{boardName}/posts") public ListResult posts(@PathVariable String boardName) { return responseService.getListResult(boardService.findPosts(boardName)); @@ -43,7 +43,7 @@ public class BoardController { @ApiImplicitParams({ @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") }) - @ApiOperation(value = "게시판 글 작성", notes = "게시판에 글을 작성한다.") + @ApiOperation(value = "게시글 작성", notes = "게시글을 작성한다.") @PostMapping(value = "/{boardName}") public SingleResult post(@PathVariable String boardName, @Valid @ModelAttribute ParamsPost post) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -51,7 +51,7 @@ public class BoardController { return responseService.getSingleResult(boardService.writePost(uid, boardName, post)); } - @ApiOperation(value = "게시판 글 상세", notes = "게시판 글 상세정보를 조회한다.") + @ApiOperation(value = "게시글 상세", notes = "게시글 상세정보를 조회한다.") @GetMapping(value = "/post/{postId}") public SingleResult post(@PathVariable long postId) { return responseService.getSingleResult(boardService.getPost(postId)); @@ -60,7 +60,7 @@ public class BoardController { @ApiImplicitParams({ @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") }) - @ApiOperation(value = "게시판 글 수정", notes = "게시판의 글을 수정한다.") + @ApiOperation(value = "게시글 수정", notes = "게시판의 글을 수정한다.") @PutMapping(value = "/post/{postId}") public SingleResult post(@PathVariable long postId, @Valid @ModelAttribute ParamsPost post) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -71,7 +71,7 @@ public class BoardController { @ApiImplicitParams({ @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") }) - @ApiOperation(value = "게시판 글 삭제", notes = "게시판의 글을 삭제한다.") + @ApiOperation(value = "게시글 삭제", notes = "게시글을 삭제한다.") @DeleteMapping(value = "/post/{postId}") public CommonResult deletePost(@PathVariable long postId) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); diff --git a/src/main/java/com/rest/api/entity/User.java b/src/main/java/com/rest/api/entity/User.java index c2628a5..34818b5 100644 --- a/src/main/java/com/rest/api/entity/User.java +++ b/src/main/java/com/rest/api/entity/User.java @@ -2,6 +2,7 @@ package com.rest.api.entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.rest.api.entity.common.CommonDateEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -23,7 +24,7 @@ import java.util.stream.Collectors; @AllArgsConstructor // 인자를 모두 갖춘 생성자를 자동으로 생성합니다. @Table(name = "user") // 'user' 테이블과 매핑됨을 명시 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) -public class User implements UserDetails { +public class User extends CommonDateEntity implements UserDetails { @Id // pk @GeneratedValue(strategy = GenerationType.IDENTITY) private Long msrl; diff --git a/src/main/java/com/rest/api/service/board/BoardService.java b/src/main/java/com/rest/api/service/board/BoardService.java index c6f8ba9..4d0a32d 100644 --- a/src/main/java/com/rest/api/service/board/BoardService.java +++ b/src/main/java/com/rest/api/service/board/BoardService.java @@ -11,13 +11,12 @@ import com.rest.api.repo.UserJpaRepo; import com.rest.api.repo.board.BoardJpaRepo; import com.rest.api.repo.board.PostJpaRepo; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; +import java.util.Optional; -@Slf4j @Service @Transactional @RequiredArgsConstructor @@ -28,7 +27,7 @@ public class BoardService { private final UserJpaRepo userJpaRepo; public Board findBoard(String boardName) { - return boardJpaRepo.findByName(boardName); + return Optional.ofNullable(boardJpaRepo.findByName(boardName)).orElseThrow(CResourceNotExistException::new); } public List findPosts(String boardName) { diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index cf53549..00008ac 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,6 +1,6 @@ logging: level: - root: debug + root: info com.rest.api: debug spring: diff --git a/src/main/resources/i18n/exception_ko.yml b/src/main/resources/i18n/exception_ko.yml index cb6e423..a1537c8 100644 --- a/src/main/resources/i18n/exception_ko.yml +++ b/src/main/resources/i18n/exception_ko.yml @@ -24,4 +24,4 @@ notOwner: msg: "해당 자원의 소유자가 아닙니다." resourceNotExist: code: "-1007" - msg: "요청하신 자원이 존재 하지 않습니다." \ No newline at end of file + msg: "요청한 자원이 존재 하지 않습니다." \ No newline at end of file From 69f3053371ef4e14ec4210d5e9b52796fd4801ea Mon Sep 17 00:00:00 2001 From: kimyonghwa Date: Fri, 10 May 2019 10:27:03 +0900 Subject: [PATCH 3/4] Modified the unit test --- .../rest/api/controller/v1/UserController.java | 10 +++++----- src/main/java/com/rest/api/entity/User.java | 6 ++---- .../api/controller/v1/UserControllerTest.java | 15 ++++++++------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/rest/api/controller/v1/UserController.java b/src/main/java/com/rest/api/controller/v1/UserController.java index c5c4541..cf1f437 100644 --- a/src/main/java/com/rest/api/controller/v1/UserController.java +++ b/src/main/java/com/rest/api/controller/v1/UserController.java @@ -51,12 +51,12 @@ public class UserController { @ApiOperation(value = "회원 수정", notes = "회원정보를 수정한다") @PutMapping(value = "/user") public SingleResult modify( - @ApiParam(value = "회원번호", required = true) @RequestParam long msrl, @ApiParam(value = "회원이름", required = true) @RequestParam String name) { - User user = User.builder() - .msrl(msrl) - .name(name) - .build(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String id = authentication.getName(); + User user = userJpaRepo.findByUid(id).orElseThrow(CUserNotFoundException::new); + user.setName(name); return responseService.getSingleResult(userJpaRepo.save(user)); } diff --git a/src/main/java/com/rest/api/entity/User.java b/src/main/java/com/rest/api/entity/User.java index 34818b5..7129f5c 100644 --- a/src/main/java/com/rest/api/entity/User.java +++ b/src/main/java/com/rest/api/entity/User.java @@ -3,10 +3,7 @@ package com.rest.api.entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.rest.api.entity.common.CommonDateEntity; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -20,6 +17,7 @@ import java.util.stream.Collectors; @Builder // builder를 사용할수 있게 합니다. @Entity // jpa entity임을 알립니다. @Getter // user 필드값의 getter를 자동으로 생성합니다. +@Setter @NoArgsConstructor // 인자없는 생성자를 자동으로 생성합니다. @AllArgsConstructor // 인자를 모두 갖춘 생성자를 자동으로 생성합니다. @Table(name = "user") // 'user' 테이블과 매핑됨을 명시 diff --git a/src/test/java/com/rest/api/controller/v1/UserControllerTest.java b/src/test/java/com/rest/api/controller/v1/UserControllerTest.java index a4d410a..9cc4908 100644 --- a/src/test/java/com/rest/api/controller/v1/UserControllerTest.java +++ b/src/test/java/com/rest/api/controller/v1/UserControllerTest.java @@ -47,7 +47,7 @@ public class UserControllerTest { @Before public void setUp() throws Exception { - userJpaRepo.save(User.builder().uid("happydaddy@naver.com").name("happydaddy").password(passwordEncoder.encode("1234")).roles(Collections.singletonList("ROLE_USER")).build()); + //userJpaRepo.save(User.builder().uid("happydaddy@naver.com").name("happydaddy").password(passwordEncoder.encode("1234")).roles(Collections.singletonList("ROLE_USER")).build()); MultiValueMap params = new LinkedMultiValueMap<>(); params.add("id", "happydaddy@naver.com"); params.add("password", "1234"); @@ -75,8 +75,8 @@ public class UserControllerTest { .get("/v1/users") .header("X-AUTH-TOKEN", "XXXXXXXXXX")) .andDo(print()) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/exception/entrypoint")); + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/exception/entrypoint")); } @Test @@ -86,8 +86,8 @@ public class UserControllerTest { .get("/v1/users")) //.header("X-AUTH-TOKEN", token)) .andDo(print()) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/exception/accessdenied")); + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/exception/accessdenied")); } @Test @@ -115,7 +115,7 @@ public class UserControllerTest { @Test public void modify() throws Exception { MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("msrl", "1"); + params.add("uid", "happydaddy@naver.com"); params.add("name", "행복전도사"); mockMvc.perform(MockMvcRequestBuilders .put("/v1/user") @@ -123,7 +123,8 @@ public class UserControllerTest { .params(params)) .andDo(print()) .andExpect(status().isOk()) - .andExpect(jsonPath("$.success").value(true)); + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.data.name").value("행복전도사")); } @Test From 2a0a9721ed27e5107e7db22bd6463a578fb487e7 Mon Sep 17 00:00:00 2001 From: kimyonghwa Date: Fri, 10 May 2019 23:40:33 +0900 Subject: [PATCH 4/4] Bugfix board --- src/main/java/com/rest/api/entity/User.java | 2 +- .../java/com/rest/api/entity/board/Board.java | 8 +++--- .../java/com/rest/api/entity/board/Post.java | 25 +++++++++++++++---- .../com/rest/api/model/board/ParamsPost.java | 5 +++- .../com/rest/api/repo/board/PostJpaRepo.java | 3 ++- .../rest/api/service/board/BoardService.java | 11 +++++--- 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/rest/api/entity/User.java b/src/main/java/com/rest/api/entity/User.java index 34818b5..6236ad1 100644 --- a/src/main/java/com/rest/api/entity/User.java +++ b/src/main/java/com/rest/api/entity/User.java @@ -23,7 +23,7 @@ import java.util.stream.Collectors; @NoArgsConstructor // 인자없는 생성자를 자동으로 생성합니다. @AllArgsConstructor // 인자를 모두 갖춘 생성자를 자동으로 생성합니다. @Table(name = "user") // 'user' 테이블과 매핑됨을 명시 -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) // Post Entity에서 User와의 관계를 Json으로 변환시 오류 방지를 위한 코드 public class User extends CommonDateEntity implements UserDetails { @Id // pk @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/rest/api/entity/board/Board.java b/src/main/java/com/rest/api/entity/board/Board.java index 0039f1e..f090b81 100644 --- a/src/main/java/com/rest/api/entity/board/Board.java +++ b/src/main/java/com/rest/api/entity/board/Board.java @@ -4,10 +4,7 @@ import com.rest.api.entity.common.CommonDateEntity; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; @Entity @Getter @@ -15,6 +12,7 @@ import javax.persistence.Id; public class Board extends CommonDateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long boardId; + @Column(nullable = false, length = 100) private String name; } diff --git a/src/main/java/com/rest/api/entity/board/Post.java b/src/main/java/com/rest/api/entity/board/Post.java index 9d49ce2..538cc6f 100644 --- a/src/main/java/com/rest/api/entity/board/Post.java +++ b/src/main/java/com/rest/api/entity/board/Post.java @@ -13,23 +13,38 @@ import javax.persistence.*; public class Post extends CommonDateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Long postId; + @Column(nullable = false, length = 50) private String author; + @Column(nullable = false, length = 100) private String title; + @Column(length = 500) private String content; - private Long boardId; @ManyToOne(fetch = FetchType.LAZY) - private User user; + @JoinColumn(name = "board_id") + private Board board; // 게시글 - 게시판의 관계 - N:1 - public Post(User user, Long boardId, String author, String title, String content) { + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "msrl") + private User user; // 게시글 - 회원의 관계 - N:1 + + // Join 테이블이 Json결과에 표시되지 않도록 처리. + protected Board getBoard() { + return board; + } + + // 생성자 + public Post(User user, Board board, String author, String title, String content) { this.user = user; - this.boardId = boardId; + this.board = board; this.author = author; this.title = title; this.content = content; } + // 수정시 데이터 처리 public Post setUpdate(String author, String title, String content) { this.author = author; this.title = title; diff --git a/src/main/java/com/rest/api/model/board/ParamsPost.java b/src/main/java/com/rest/api/model/board/ParamsPost.java index b4b7f38..8e76407 100644 --- a/src/main/java/com/rest/api/model/board/ParamsPost.java +++ b/src/main/java/com/rest/api/model/board/ParamsPost.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import javax.validation.constraints.Max; import javax.validation.constraints.NotEmpty; @Getter @@ -12,12 +13,14 @@ import javax.validation.constraints.NotEmpty; @NoArgsConstructor public class ParamsPost { @NotEmpty + @Max(50) @ApiModelProperty(value = "작성자명", required = true) private String author; @NotEmpty + @Max(100) @ApiModelProperty(value = "제목", required = true) private String title; - @NotEmpty + @Max(500) @ApiModelProperty(value = "내용", required = true) private String content; } diff --git a/src/main/java/com/rest/api/repo/board/PostJpaRepo.java b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java index 38ae636..11fefe8 100644 --- a/src/main/java/com/rest/api/repo/board/PostJpaRepo.java +++ b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java @@ -1,10 +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 findByBoardId(Long boardId); + List findByBoard(Board board); } \ No newline at end of file diff --git a/src/main/java/com/rest/api/service/board/BoardService.java b/src/main/java/com/rest/api/service/board/BoardService.java index 4d0a32d..47ea2ab 100644 --- a/src/main/java/com/rest/api/service/board/BoardService.java +++ b/src/main/java/com/rest/api/service/board/BoardService.java @@ -26,25 +26,29 @@ public class BoardService { private final PostJpaRepo postJpaRepo; private final UserJpaRepo userJpaRepo; + // 게시판 이름으로 게시판을 조회. 없을경우 CResourceNotExistException 처리 public Board findBoard(String boardName) { return Optional.ofNullable(boardJpaRepo.findByName(boardName)).orElseThrow(CResourceNotExistException::new); } + // 게시판 이름으로 게시물 리스트 조회. public List findPosts(String boardName) { - Board board = findBoard(boardName); - return postJpaRepo.findByBoardId(board.getId()); + return postJpaRepo.findByBoard(findBoard(boardName)); } + // 게시물ID로 게시물 단건 조회. 없을경우 CResourceNotExistException 처리 public Post getPost(long postId) { return postJpaRepo.findById(postId).orElseThrow(CResourceNotExistException::new); } + // 게시물을 등록합니다. 게시물의 회원UID가 조회되지 않으면 CUserNotFoundException 처리합니다. public Post writePost(String uid, String boardName, ParamsPost paramsPost) { Board board = findBoard(boardName); - Post post = new Post(userJpaRepo.findByUid(uid).orElseThrow(CUserNotFoundException::new), board.getId(), paramsPost.getAuthor(), paramsPost.getTitle(), paramsPost.getContent()); + Post post = new Post(userJpaRepo.findByUid(uid).orElseThrow(CUserNotFoundException::new), board, paramsPost.getAuthor(), paramsPost.getTitle(), paramsPost.getContent()); return postJpaRepo.save(post); } + // 게시물을 수정합니다. 게시물 등록자와 로그인 회원정보가 틀리면 CNotOwnerException 처리합니다. public Post updatePost(long postId, String uid, ParamsPost paramsPost) { Post post = getPost(postId); User user = post.getUser(); @@ -55,6 +59,7 @@ public class BoardService { return postJpaRepo.save(post); } + // 게시물을 삭제합니다. 게시물 등록자와 로그인 회원정보가 틀리면 CNotOwnerException 처리합니다. public boolean deletePost(long postId, String uid) { Post post = getPost(postId); User user = post.getUser();