diff --git a/.gitignore b/.gitignore index c2065bc..ba9d2be 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ bin/ out/ !**/src/main/**/out/ !**/src/test/**/out/ +application.yml ### NetBeans ### /nbproject/private/ diff --git a/build.gradle b/build.gradle index 728ec9c..0fc19d9 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' runtimeOnly 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/com/example/demo/advice/GlobalExceptionHandler.java b/src/main/java/com/example/demo/advice/GlobalExceptionHandler.java new file mode 100644 index 0000000..00d05bb --- /dev/null +++ b/src/main/java/com/example/demo/advice/GlobalExceptionHandler.java @@ -0,0 +1,25 @@ +package com.example.demo.advice; + +import com.example.demo.exception.HTTPApiException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.sql.SQLIntegrityConstraintViolationException; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(EmptyResultDataAccessException.class) + public ResponseEntity handleEmptyResultDataAccessException(EmptyResultDataAccessException e) { + return new ResponseEntity<>("해당 데이터를 찾을 수 없음.", HttpStatusCode.valueOf(404)); + } + + @ExceptionHandler(HTTPApiException.class) + public ResponseEntity handleHTTPApiException(HTTPApiException e) { + return new ResponseEntity<>(e.getMessage(), HttpStatusCode.valueOf(e.getHttpCode())); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/ArticleController.java b/src/main/java/com/example/demo/controller/ArticleController.java index b28e4dd..c1193b2 100644 --- a/src/main/java/com/example/demo/controller/ArticleController.java +++ b/src/main/java/com/example/demo/controller/ArticleController.java @@ -3,6 +3,8 @@ import java.net.URI; import java.util.List; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.proxyservice.ArticleProxyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -21,16 +23,16 @@ @RestController public class ArticleController { - private final ArticleService articleService; + private final ArticleProxyService articleService; - public ArticleController(ArticleService articleService) { + public ArticleController(ArticleProxyService articleService) { this.articleService = articleService; } @GetMapping("/articles") public ResponseEntity> getArticles( @RequestParam Long boardId - ) { + ) throws HTTPApiException { List response = articleService.getByBoardId(boardId); return ResponseEntity.ok(response); } @@ -46,7 +48,7 @@ public ResponseEntity getArticle( @PostMapping("/articles") public ResponseEntity crateArticle( @RequestBody ArticleCreateRequest request - ) { + ) throws HTTPApiException { ArticleResponse response = articleService.create(request); return ResponseEntity.created(URI.create("/articles/" + response.id())).body(response); } @@ -55,7 +57,7 @@ public ResponseEntity crateArticle( public ResponseEntity updateArticle( @PathVariable Long id, @RequestBody ArticleUpdateRequest request - ) { + ) throws HTTPApiException { ArticleResponse response = articleService.update(id, request); return ResponseEntity.ok(response); } @@ -63,7 +65,7 @@ public ResponseEntity updateArticle( @DeleteMapping("/articles/{id}") public ResponseEntity updateArticle( @PathVariable Long id - ) { + ) throws HTTPApiException { articleService.delete(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/demo/controller/BoardController.java b/src/main/java/com/example/demo/controller/BoardController.java index ada81dc..8f5b1b3 100644 --- a/src/main/java/com/example/demo/controller/BoardController.java +++ b/src/main/java/com/example/demo/controller/BoardController.java @@ -2,6 +2,8 @@ import java.util.List; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.proxyservice.BoardProxyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -19,9 +21,9 @@ @RestController public class BoardController { - private final BoardService boardService; + private final BoardProxyService boardService; - public BoardController(BoardService boardService) { + public BoardController(BoardProxyService boardService) { this.boardService = boardService; } @@ -40,7 +42,7 @@ public BoardResponse getBoard( @PostMapping("/boards") public BoardResponse createBoard( @RequestBody BoardCreateRequest request - ) { + ) throws HTTPApiException { return boardService.createBoard(request); } @@ -48,14 +50,14 @@ public BoardResponse createBoard( public BoardResponse updateBoard( @PathVariable Long id, @RequestBody BoardUpdateRequest updateRequest - ) { + ) throws HTTPApiException { return boardService.update(id, updateRequest); } @DeleteMapping("/boards/{id}") public ResponseEntity deleteBoard( @PathVariable Long id - ) { + ) throws HTTPApiException { boardService.deleteBoard(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/demo/controller/LoginController.java b/src/main/java/com/example/demo/controller/LoginController.java new file mode 100644 index 0000000..1d29372 --- /dev/null +++ b/src/main/java/com/example/demo/controller/LoginController.java @@ -0,0 +1,62 @@ +package com.example.demo.controller; + +import com.example.demo.entity.Member; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.proxyservice.ArticleProxyService; +import com.example.demo.proxyservice.LoginProxyService; +import com.example.demo.proxyservice.MemberProxyService; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttribute; + +@Controller +public class LoginController { + + private final LoginProxyService loginService; + private final ArticleProxyService articleService; + + public LoginController(LoginProxyService loginService, ArticleProxyService articleService) { + this.loginService = loginService; + this.articleService = articleService; + } + + @GetMapping("/login") + public String getLoginPage() { + return "login"; + } + + @PostMapping("/login") + public String postLoginPage( + @RequestParam(required = false) String email, + @RequestParam(required = false) String password, + HttpServletRequest request + ) throws HTTPApiException { + return loginService.login(email, password, request); + } + + @GetMapping("/showmethearticles") + public String myArticles( + @SessionAttribute(name = "loginMember", required = false) Member member, + Model model + ) throws HTTPApiException { + return loginService.myArticles(member, model); + } + + @GetMapping("/sign") + public String getSignPage() { + return "sign"; + } + + @PostMapping("/sign") + public String postSign( + @RequestParam(required = false)String name, + @RequestParam(required = false)String email, + @RequestParam(required = false)String password + ) throws HTTPApiException { + return loginService.postSign(name, email, password); + } +} diff --git a/src/main/java/com/example/demo/controller/MemberController.java b/src/main/java/com/example/demo/controller/MemberController.java index ddb18ec..c0f0df7 100644 --- a/src/main/java/com/example/demo/controller/MemberController.java +++ b/src/main/java/com/example/demo/controller/MemberController.java @@ -2,6 +2,8 @@ import java.util.List; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.proxyservice.MemberProxyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -19,9 +21,9 @@ @RestController public class MemberController { - private final MemberService memberService; + private final MemberProxyService memberService; - public MemberController(MemberService memberService) { + public MemberController(MemberProxyService memberService) { this.memberService = memberService; } @@ -42,7 +44,7 @@ public ResponseEntity getMember( @PostMapping("/members") public ResponseEntity create( @RequestBody MemberCreateRequest request - ) { + ) throws HTTPApiException { MemberResponse response = memberService.create(request); return ResponseEntity.ok(response); } @@ -51,7 +53,7 @@ public ResponseEntity create( public ResponseEntity updateMember( @PathVariable Long id, @RequestBody MemberUpdateRequest request - ) { + ) throws HTTPApiException { MemberResponse response = memberService.update(id, request); return ResponseEntity.ok(response); } @@ -59,7 +61,7 @@ public ResponseEntity updateMember( @DeleteMapping("/members/{id}") public ResponseEntity deleteMember( @PathVariable Long id - ) { + ) throws HTTPApiException { memberService.delete(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/demo/controller/PageController.java b/src/main/java/com/example/demo/controller/PageController.java index da08efc..3676e92 100644 --- a/src/main/java/com/example/demo/controller/PageController.java +++ b/src/main/java/com/example/demo/controller/PageController.java @@ -1,7 +1,17 @@ package com.example.demo.controller; +import com.example.demo.entity.Member; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.proxyservice.ArticleProxyService; +import com.example.demo.proxyservice.MemberProxyService; +import com.example.demo.service.MemberService; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttribute; @Controller @@ -23,4 +33,5 @@ public String getArticlesPage() { public String getArticleDetailPage() { return "article"; } + } diff --git a/src/main/java/com/example/demo/controller/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/demo/controller/dto/request/ArticleUpdateRequest.java index aced461..1177957 100644 --- a/src/main/java/com/example/demo/controller/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/demo/controller/dto/request/ArticleUpdateRequest.java @@ -1,6 +1,7 @@ package com.example.demo.controller.dto.request; public record ArticleUpdateRequest( + Long authorId, Long boardId, String title, String description diff --git a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java index 65f048f..3c33f18 100644 --- a/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/ArticleResponse.java @@ -2,9 +2,9 @@ import java.time.LocalDateTime; -import com.example.demo.domain.Article; -import com.example.demo.domain.Board; -import com.example.demo.domain.Member; +import com.example.demo.entity.Article; +import com.example.demo.entity.Board; +import com.example.demo.entity.Member; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; @@ -24,11 +24,11 @@ public record ArticleResponse( LocalDateTime modifiedDate ) { - public static ArticleResponse of(Article article, Member member, Board board) { + public static ArticleResponse of(Article article) { return new ArticleResponse( article.getId(), - member.getId(), - board.getId(), + article.getAuthor().getId(), + article.getBoard().getId(), article.getTitle(), article.getContent(), article.getCreatedAt(), diff --git a/src/main/java/com/example/demo/controller/dto/response/BoardResponse.java b/src/main/java/com/example/demo/controller/dto/response/BoardResponse.java index 01f6e3e..d359d7c 100644 --- a/src/main/java/com/example/demo/controller/dto/response/BoardResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/BoardResponse.java @@ -1,6 +1,6 @@ package com.example.demo.controller.dto.response; -import com.example.demo.domain.Board; +import com.example.demo.entity.Board; public record BoardResponse( Long id, diff --git a/src/main/java/com/example/demo/controller/dto/response/MemberResponse.java b/src/main/java/com/example/demo/controller/dto/response/MemberResponse.java index f79aeb6..f9aa55c 100644 --- a/src/main/java/com/example/demo/controller/dto/response/MemberResponse.java +++ b/src/main/java/com/example/demo/controller/dto/response/MemberResponse.java @@ -1,6 +1,6 @@ package com.example.demo.controller.dto.response; -import com.example.demo.domain.Member; +import com.example.demo.entity.Member; public record MemberResponse( Long id, diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java deleted file mode 100644 index e0183db..0000000 --- a/src/main/java/com/example/demo/domain/Article.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.demo.domain; - -import java.time.LocalDateTime; - -public class Article { - - private Long id; - private Long authorId; - private Long boardId; - private String title; - private String content; - private LocalDateTime createdAt; - private LocalDateTime modifiedAt; - - public Article( - Long id, - Long authorId, - Long boardId, - String title, - String content, - LocalDateTime createdAt, - LocalDateTime modifiedAt - ) { - this.id = id; - this.authorId = authorId; - this.boardId = boardId; - this.title = title; - this.content = content; - this.createdAt = createdAt; - this.modifiedAt = modifiedAt; - } - - public Article(Long authorId, Long boardId, String title, String content) { - this.id = null; - this.authorId = authorId; - this.boardId = boardId; - this.title = title; - this.content = content; - this.createdAt = LocalDateTime.now(); - this.modifiedAt = LocalDateTime.now(); - } - - public void update(Long boardId, String title, String description) { - this.boardId = boardId; - this.title = title; - this.content = description; - this.modifiedAt = LocalDateTime.now(); - } - - public void setId(Long id) { - this.id = id; - } - - public void setModifiedAt(LocalDateTime modifiedAt) { - this.modifiedAt = modifiedAt; - } - - public Long getId() { - return id; - } - - public Long getAuthorId() { - return authorId; - } - - public Long getBoardId() { - return boardId; - } - - public String getTitle() { - return title; - } - - public String getContent() { - return content; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public LocalDateTime getModifiedAt() { - return modifiedAt; - } -} diff --git a/src/main/java/com/example/demo/domain/Board.java b/src/main/java/com/example/demo/domain/Board.java deleted file mode 100644 index 992e2c6..0000000 --- a/src/main/java/com/example/demo/domain/Board.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.demo.domain; - -public class Board { - - private Long id; - private String name; - - public Board(Long id, String name) { - this.id = id; - this.name = name; - } - - public Board(String name) { - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void update(String name) { - this.name = name; - } -} diff --git a/src/main/java/com/example/demo/entity/Article.java b/src/main/java/com/example/demo/entity/Article.java new file mode 100644 index 0000000..690749a --- /dev/null +++ b/src/main/java/com/example/demo/entity/Article.java @@ -0,0 +1,97 @@ +package com.example.demo.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "article") +public class Article { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id") + private Member author; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id") + private Board board; + private String title; + private String content; + @Column(name = "created_date") + private LocalDateTime createdAt; + @Column(name = "modified_date") + private LocalDateTime modifiedAt; + + public Article() { + } + + public Article( + Long id, + Member author, + Board board, + String title, + String content + ) { + this.id = id; + this.author = author; + this.board = board; + this.title = title; + this.content = content; + } + + public Article(Member author, Board board, String title, String content) { + this.author = author; + this.board = board; + this.title = title; + this.content = content; + this.createdAt = LocalDateTime.now(); + this.modifiedAt = LocalDateTime.now(); + } + + public void update(Member author, Board board, String title, String description) { + this.author = author; + this.board = board; + this.title = title; + this.content = description; + this.modifiedAt = LocalDateTime.now(); + } + + public void convenienceMethod(Member author, Board board) { + author.addArticle(this); + board.addArticle(this); + } + + public void setModifiedAt(LocalDateTime modifiedAt) { + this.modifiedAt = modifiedAt; + } + + public Long getId() { + return id; + } + + public Member getAuthor() { + return author; + } + + public Board getBoard() { + return board; + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getModifiedAt() { + return modifiedAt; + } +} diff --git a/src/main/java/com/example/demo/entity/Board.java b/src/main/java/com/example/demo/entity/Board.java new file mode 100644 index 0000000..d9b53b8 --- /dev/null +++ b/src/main/java/com/example/demo/entity/Board.java @@ -0,0 +1,52 @@ +package com.example.demo.entity; + +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "board") +public class Board { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + @OneToMany(mappedBy = "board") + private List
articles = new ArrayList<>(); + + public Board() { + + } + + public Board(Long id, String name) { + this.id = id; + this.name = name; + } + + public void addArticle(Article article) { + articles.add(article); + } + + public Board(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public void update(String name) { + this.name = name; + } + + public List
getArticles() { + return articles; + } + +} diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/entity/Member.java similarity index 63% rename from src/main/java/com/example/demo/domain/Member.java rename to src/main/java/com/example/demo/entity/Member.java index fe80d6b..00d9698 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/entity/Member.java @@ -1,11 +1,26 @@ -package com.example.demo.domain; +package com.example.demo.entity; +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "member") public class Member { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private String password; + @OneToMany(mappedBy = "author") + private List
articles = new ArrayList<>(); + + public Member() { + + } public Member(Long id, String name, String email, String password) { this.id = id; @@ -20,15 +35,15 @@ public Member(String name, String email, String password) { this.password = password; } + public void addArticle(Article article) { + articles.add(article); + } + public void update(String name, String email) { this.name = name; this.email = email; } - public void setId(Long id) { - this.id = id; - } - public Long getId() { return id; } @@ -41,6 +56,10 @@ public String getEmail() { return email; } + public List
getArticles() { + return articles; + } + public String getPassword() { return password; } diff --git a/src/main/java/com/example/demo/exception/ExceptionType.java b/src/main/java/com/example/demo/exception/ExceptionType.java new file mode 100644 index 0000000..82cffe9 --- /dev/null +++ b/src/main/java/com/example/demo/exception/ExceptionType.java @@ -0,0 +1,38 @@ +package com.example.demo.exception; + +public enum ExceptionType { + + Server_Error(505, "알 수 없는 서버 에러 (벡엔드 개발자에게 직접 문의해주세요.)"), + Member_NotNullName(400, "'name' 값이 Null이 될 수 없습니다."), + Member_NotNullEmail(400, "'email' 값이 Null이 될 수 없습니다."), + Member_NotNullPassWord(400, "'password' 값이 Null이 될 수 없습니다."), + Member_OverLapEmail(409, "'email' 값은 중복 될 수 없습니다."), + Member_CantDelete(400, "유저가 작성한 게시물이 존재하기 때문에 삭제 할 수 없습니다."), + Member_IsNull(400, "유저가 존재하지 않습니다."), + Board_NotNullName(400, "'name' 값이 Null이 될 수 없습니다."), + Board_CantDelete(400, "게시판에 작성된 게시물이 존재하기 때문에 삭제 할 수 없습니다."), + Board_IsNull(400, "게시판이 존재하지 않습니다."), + Article_NotNullAuthorId(400, "'authorId' 값이 Null이 될 수 없습니다."), + Article_NotNullBoardId(400, "'boardId' 값이 Null이 될 수 없습니다."), + Article_NotNullTitle(400, "'title' 값이 Null이 될 수 없습니다."), + Article_NotNullDescription(400, "'description' 값이 Null이 될 수 없습니다."), + Article_IsNull(400, "게시물이 존재하지 않습니다.") + ; + + private final int httpstate; + private final String message; + + ExceptionType(int httpstate, String message) { + this.httpstate = httpstate; + this.message = message; + } + + public int getHttpstate() { + return httpstate; + } + + public String getMessage() { + return message; + } + +} diff --git a/src/main/java/com/example/demo/exception/HTTPApiException.java b/src/main/java/com/example/demo/exception/HTTPApiException.java new file mode 100644 index 0000000..a570f20 --- /dev/null +++ b/src/main/java/com/example/demo/exception/HTTPApiException.java @@ -0,0 +1,19 @@ +package com.example.demo.exception; + +public class HTTPApiException extends Exception { + + private final ExceptionType type; + + public HTTPApiException(ExceptionType type) { + this.type = type; + } + + public int getHttpCode() { + return type.getHttpstate(); + } + + public String getMessage() { + return type.getMessage(); + } + +} diff --git a/src/main/java/com/example/demo/proxyservice/ArticleProxyService.java b/src/main/java/com/example/demo/proxyservice/ArticleProxyService.java new file mode 100644 index 0000000..b6a6537 --- /dev/null +++ b/src/main/java/com/example/demo/proxyservice/ArticleProxyService.java @@ -0,0 +1,55 @@ +package com.example.demo.proxyservice; + +import com.example.demo.controller.dto.request.ArticleCreateRequest; +import com.example.demo.controller.dto.request.ArticleUpdateRequest; +import com.example.demo.controller.dto.response.ArticleResponse; +import com.example.demo.exception.ExceptionType; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.service.ArticleService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ArticleProxyService { + + private final ArticleService articleservice; + + public ArticleProxyService(ArticleService articleservice) { + this.articleservice = articleservice; + } + + public List getByBoardId(Long boardId) throws HTTPApiException { + if(!articleservice.isExistBoard(boardId)) throw new HTTPApiException(ExceptionType.Board_IsNull); + return articleservice.getByBoardId(boardId); + } + + public ArticleResponse getById(Long id) { + return articleservice.getById(id); + } + + public ArticleResponse create(ArticleCreateRequest request) throws HTTPApiException { + if(request.authorId()==null) throw new HTTPApiException(ExceptionType.Article_NotNullAuthorId); + if(request.boardId()==null) throw new HTTPApiException(ExceptionType.Article_NotNullBoardId); + if(request.title()==null) throw new HTTPApiException(ExceptionType.Article_NotNullTitle); + if(request.description()==null) throw new HTTPApiException(ExceptionType.Article_NotNullDescription); + if(!articleservice.isExistBoard(request.boardId())) throw new HTTPApiException(ExceptionType.Board_IsNull); + if(!articleservice.isExistUser(request.authorId())) throw new HTTPApiException(ExceptionType.Member_IsNull); + return articleservice.create(request); + } + + public ArticleResponse update(Long id, ArticleUpdateRequest request) throws HTTPApiException { + if(request.authorId()==null) throw new HTTPApiException(ExceptionType.Article_NotNullAuthorId); + if(request.boardId()==null) throw new HTTPApiException(ExceptionType.Article_NotNullBoardId); + if(request.title()==null) throw new HTTPApiException(ExceptionType.Article_NotNullTitle); + if(request.description()==null) throw new HTTPApiException(ExceptionType.Article_NotNullDescription); + if(!articleservice.isExistBoard(request.boardId())) throw new HTTPApiException(ExceptionType.Board_IsNull); + if(!articleservice.isExistUser(request.authorId())) throw new HTTPApiException(ExceptionType.Member_IsNull); + return articleservice.update(id, request); + } + + public void delete(Long id) throws HTTPApiException { + if(!articleservice.isExist(id)) throw new HTTPApiException(ExceptionType.Article_IsNull); + articleservice.delete(id); + } +} diff --git a/src/main/java/com/example/demo/proxyservice/BoardProxyService.java b/src/main/java/com/example/demo/proxyservice/BoardProxyService.java new file mode 100644 index 0000000..8451841 --- /dev/null +++ b/src/main/java/com/example/demo/proxyservice/BoardProxyService.java @@ -0,0 +1,48 @@ +package com.example.demo.proxyservice; + +import com.example.demo.controller.dto.request.BoardCreateRequest; +import com.example.demo.controller.dto.request.BoardUpdateRequest; +import com.example.demo.controller.dto.response.BoardResponse; +import com.example.demo.exception.ExceptionType; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.service.BoardService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BoardProxyService { + + private final BoardService boardservice; + + public BoardProxyService(BoardService boardservice) { + this.boardservice = boardservice; + } + + public List getBoards() { + return boardservice.getBoards(); + } + + public BoardResponse getBoardById(Long id) { + return boardservice.getBoardById(id); + } + + public BoardResponse createBoard(BoardCreateRequest request) throws HTTPApiException { + if(request.name()==null) throw new HTTPApiException(ExceptionType.Board_NotNullName); + return boardservice.createBoard(request); + } + + public BoardResponse update(Long id, BoardUpdateRequest updateRequest) throws HTTPApiException { + if(updateRequest.name()==null) throw new HTTPApiException(ExceptionType.Board_NotNullName); + return boardservice.update(id, updateRequest); + } + + public void deleteBoard(Long id) throws HTTPApiException { + if(!boardservice.isExist(id)) throw new HTTPApiException(ExceptionType.Board_IsNull); + try{ + boardservice.deleteBoard(id); + }catch(Exception e) { + throw new HTTPApiException(ExceptionType.Board_CantDelete); + } + } +} diff --git a/src/main/java/com/example/demo/proxyservice/LoginProxyService.java b/src/main/java/com/example/demo/proxyservice/LoginProxyService.java new file mode 100644 index 0000000..edfd940 --- /dev/null +++ b/src/main/java/com/example/demo/proxyservice/LoginProxyService.java @@ -0,0 +1,64 @@ +package com.example.demo.proxyservice; + +import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.entity.Member; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.service.LoginService; +import com.example.demo.service.MemberService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttribute; + +@Service +public class LoginProxyService { + + private final LoginService loginservice; + + public LoginProxyService(LoginService loginservice) { + this.loginservice = loginservice; + } + + public String login( + @RequestParam(required = false) String email, + @RequestParam(required = false) String password, + HttpServletRequest request + ) throws HTTPApiException { + if(email==null||password==null) { + return "redirect:/login"; + } + Member loginmember = loginservice.getMemberWithLogin(email, password); + HttpSession session = request.getSession(); + session.setAttribute("loginMember", loginmember); + return "redirect:/showmethearticles"; + } + + public String myArticles( + @SessionAttribute(name = "loginMember", required = false) Member member, + Model model + ) throws HTTPApiException { + if(member==null) { + return "redirect:/login"; + } + model.addAttribute("articles", loginservice.getByMemberId(member.getId())); + return "showmethearticles"; + } + + public String postSign( + @RequestParam(required = false)String name, + @RequestParam(required = false)String email, + @RequestParam(required = false)String password + ) throws HTTPApiException { + if(name==null||email==null||password==null) { + return "redirect:/regist"; + } + if(loginservice.isExistEmail(email)) { + return "redirect:/regist"; + } + loginservice.create(new MemberCreateRequest(name, email, password)); + return "redirect:/login"; + } + +} diff --git a/src/main/java/com/example/demo/proxyservice/MemberProxyService.java b/src/main/java/com/example/demo/proxyservice/MemberProxyService.java new file mode 100644 index 0000000..c11b369 --- /dev/null +++ b/src/main/java/com/example/demo/proxyservice/MemberProxyService.java @@ -0,0 +1,59 @@ +package com.example.demo.proxyservice; + +import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.controller.dto.request.MemberUpdateRequest; +import com.example.demo.controller.dto.response.MemberResponse; +import com.example.demo.entity.Article; +import com.example.demo.entity.Member; +import com.example.demo.exception.ExceptionType; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.service.MemberService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttribute; + +import java.util.List; + +@Service +public class MemberProxyService { + + private final MemberService memberservice; + + public MemberProxyService(MemberService memberservice) { + this.memberservice = memberservice; + } + + public List getAll() { + return memberservice.getAll(); + } + + public MemberResponse getById(Long id) { + return memberservice.getById(id); + } + + public MemberResponse create(MemberCreateRequest request) throws HTTPApiException { + if(request.name()==null) throw new HTTPApiException(ExceptionType.Member_NotNullName); + if(request.email()==null) throw new HTTPApiException(ExceptionType.Member_NotNullEmail); + if(request.password()==null) throw new HTTPApiException(ExceptionType.Member_NotNullPassWord); + if(memberservice.isExistEmail(0L, request.email())) throw new HTTPApiException(ExceptionType.Member_OverLapEmail); + return memberservice.create(request); + } + + public MemberResponse update(Long id, MemberUpdateRequest request) throws HTTPApiException { + if(request.name()==null) throw new HTTPApiException(ExceptionType.Member_NotNullName); + if(request.email()==null) throw new HTTPApiException(ExceptionType.Member_NotNullEmail); + if(memberservice.isExistEmail(id, request.email())) throw new HTTPApiException(ExceptionType.Member_OverLapEmail); + return memberservice.update(id, request); + } + + public void delete(Long id) throws HTTPApiException { + if(!memberservice.isExistUser(id)) throw new HTTPApiException(ExceptionType.Member_IsNull); + try{ + memberservice.delete(id); + }catch(Exception e) { + throw new HTTPApiException(ExceptionType.Member_CantDelete); + } + } +} diff --git a/src/main/java/com/example/demo/repository/ArticleRepository.java b/src/main/java/com/example/demo/repository/ArticleRepository.java index be3ebd4..f43ab27 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepository.java +++ b/src/main/java/com/example/demo/repository/ArticleRepository.java @@ -2,21 +2,30 @@ import java.util.List; -import com.example.demo.domain.Article; +import com.example.demo.entity.Board; +import com.example.demo.entity.Member; +import jakarta.persistence.EntityManager; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface ArticleRepository { +import com.example.demo.entity.Article; - List
findAll(); +@Repository +public interface ArticleRepository extends JpaRepository { - List
findAllByBoardId(Long boardId); + default Article insert(Article article) { + return save(article); + } - List
findAllByMemberId(Long memberId); + default Article update(Article article) { + return save(article); + } - Article findById(Long id); + default void deleteById(Long id) { + delete(findById(id).get()); + } - Article insert(Article article); - - Article update(Article article); - - void deleteById(Long id); + default boolean isExist(Long id) { + return findById(id).isPresent(); + } } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java deleted file mode 100644 index c9a272e..0000000 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.example.demo.repository; - -import java.sql.PreparedStatement; -import java.util.List; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import com.example.demo.domain.Article; - -@Repository -public class ArticleRepositoryJdbc implements ArticleRepository { - - private final JdbcTemplate jdbcTemplate; - - public ArticleRepositoryJdbc(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private static final RowMapper
articleRowMapper = (rs, rowNum) -> new Article( - rs.getLong("id"), - rs.getLong("author_id"), - rs.getLong("board_id"), - rs.getString("title"), - rs.getString("content"), - rs.getTimestamp("created_date").toLocalDateTime(), - rs.getTimestamp("modified_date").toLocalDateTime() - ); - - @Override - public List
findAll() { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - """, articleRowMapper); - } - - @Override - public List
findAllByBoardId(Long boardId) { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE board_id = ? - """, articleRowMapper, boardId); - } - - @Override - public List
findAllByMemberId(Long memberId) { - return jdbcTemplate.query(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE author_id = ? - """, articleRowMapper, memberId); - } - - @Override - public Article findById(Long id) { - return jdbcTemplate.queryForObject(""" - SELECT id, board_id, author_id, title, content, created_date, modified_date - FROM article - WHERE id = ? - """, articleRowMapper, id); - } - - @Override - public Article insert(Article article) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(con -> { - PreparedStatement ps = con.prepareStatement(""" - INSERT INTO article (board_id, author_id, title, content) - VALUES (?, ?, ?, ?) - """, - new String[]{"id"}); - ps.setLong(1, article.getBoardId()); - ps.setLong(2, article.getAuthorId()); - ps.setString(3, article.getTitle()); - ps.setString(4, article.getContent()); - return ps; - }, keyHolder); - return findById(keyHolder.getKey().longValue()); - } - - @Override - public Article update(Article article) { - jdbcTemplate.update(""" - UPDATE article - SET board_id = ?, title = ?, content = ? - WHERE id = ? - """, - article.getBoardId(), - article.getTitle(), - article.getContent(), - article.getId() - ); - return findById(article.getId()); - } - - @Override - public void deleteById(Long id) { - jdbcTemplate.update(""" - DELETE FROM article - WHERE id = ? - """, id); - } -} diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java b/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java deleted file mode 100644 index 13ba78b..0000000 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.demo.repository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -import com.example.demo.domain.Article; - -public class ArticleRepositoryMemory implements ArticleRepository { - - private static final Map articles = new HashMap<>(); - private static final AtomicLong autoincrement = new AtomicLong(1); - - @Override - public List
findAll() { - return articles.entrySet().stream() - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - @Override - public List
findAllByBoardId(Long boardId) { - return articles.entrySet().stream() - .filter(it -> it.getValue().getBoardId().equals(boardId)) - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - @Override - public List
findAllByMemberId(Long memberId) { - return articles.entrySet().stream() - .filter(it -> it.getValue().getAuthorId().equals(memberId)) - .map(it -> { - Article article = it.getValue(); - article.setId(it.getKey()); - return article; - }).toList(); - } - - @Override - public Article findById(Long id) { - return articles.getOrDefault(id, null); - } - - @Override - public Article insert(Article article) { - long id = autoincrement.getAndIncrement(); - articles.put(id, article); - article.setId(id); - return article; - } - - @Override - public Article update(Article article) { - articles.put(article.getId(), article); - return article; - } - - @Override - public void deleteById(Long id) { - articles.remove(id); - } -} diff --git a/src/main/java/com/example/demo/repository/BoardRepository.java b/src/main/java/com/example/demo/repository/BoardRepository.java index cc2dfd0..fabe981 100644 --- a/src/main/java/com/example/demo/repository/BoardRepository.java +++ b/src/main/java/com/example/demo/repository/BoardRepository.java @@ -2,17 +2,29 @@ import java.util.List; -import com.example.demo.domain.Board; +import jakarta.persistence.EntityManager; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; -public interface BoardRepository { +import com.example.demo.entity.Board; - List findAll(); +@Repository +public interface BoardRepository extends JpaRepository { - Board findById(Long id); + default Board insert(Board board) { + return save(board); + } - Board insert(Board board); + default void deleteById(Long id) { + delete(findById(id).get()); + } - void deleteById(Long id); + default Board update(Board board) { + return save(board); + } - Board update(Board board); + default boolean isExist(Long id) { + return findById(id).isPresent(); + } } diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java b/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java deleted file mode 100644 index c4fd6f6..0000000 --- a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.example.demo.repository; - -import java.sql.PreparedStatement; -import java.util.List; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import com.example.demo.domain.Board; - -@Repository -public class BoardRepositoryJdbc implements BoardRepository { - - private final JdbcTemplate jdbcTemplate; - - public BoardRepositoryJdbc(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private static final RowMapper boardRowMapper = (rs, rowNum) -> new Board( - rs.getLong("id"), - rs.getString("name") - ); - - @Override - public List findAll() { - return jdbcTemplate.query(""" - SELECT id, name - FROM board - """, boardRowMapper); - } - - @Override - public Board findById(Long id) { - return jdbcTemplate.queryForObject(""" - SELECT id, name - FROM board - WHERE id = ? - """, boardRowMapper, id); - } - - @Override - public Board insert(Board board) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(con -> { - PreparedStatement ps = con.prepareStatement(""" - INSERT INTO board (name) VALUES (?) - """, new String[]{"id"}); - ps.setString(1, board.getName()); - return ps; - }, keyHolder); - return findById(keyHolder.getKey().longValue()); - } - - @Override - public void deleteById(Long id) { - jdbcTemplate.update(""" - DELETE FROM board WHERE id = ? - """, id); - } - - @Override - public Board update(Board board) { - return jdbcTemplate.queryForObject(""" - UPDATE board SET name = ? WHERE id = ? - """, boardRowMapper, board.getName(), board.getId() - ); - } -} diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java b/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java deleted file mode 100644 index 8cf5ecf..0000000 --- a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.demo.repository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -import com.example.demo.domain.Board; - -public class BoardRepositoryMemory implements BoardRepository { - - private static final Map boards = new HashMap<>(); - private static final AtomicLong autoincrement = new AtomicLong(1); - - static { - // 1번 게시판을 미리 만들어둔다. - boards.put(autoincrement.getAndIncrement(), new Board("자유게시판")); - } - - @Override - public List findAll() { - return boards.entrySet().stream() - .map(it -> { - Board board = it.getValue(); - board.setId(it.getKey()); - return board; - }).toList(); - } - - @Override - public Board findById(Long id) { - return boards.getOrDefault(id, null); - } - - @Override - public Board insert(Board board) { - boards.put(autoincrement.getAndIncrement(), board); - return board; - } - - @Override - public void deleteById(Long id) { - boards.remove(id); - } - - @Override - public Board update(Board board) { - return boards.put(board.getId(), board); - } -} diff --git a/src/main/java/com/example/demo/repository/MemberRepository.java b/src/main/java/com/example/demo/repository/MemberRepository.java index 8e2ad14..bb69659 100644 --- a/src/main/java/com/example/demo/repository/MemberRepository.java +++ b/src/main/java/com/example/demo/repository/MemberRepository.java @@ -2,17 +2,43 @@ import java.util.List; -import com.example.demo.domain.Member; +import jakarta.persistence.EntityManager; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; -public interface MemberRepository { +import com.example.demo.entity.Member; - List findAll(); +@Repository +public interface MemberRepository extends JpaRepository { - Member findById(Long id); + default Member insert(Member member) { + return save(member); + } - Member insert(Member member); + default Member update(Member member) { + return save(member); + } - Member update(Member member); + default void deleteById(Long id) { + delete(findById(id).get()); + } - void deleteById(Long id); + @Query("SELECT p FROM Member p WHERE NOT p.id = :notthis AND p.email = :email") + Member findByEmail(Long notthis, String email); + + @Query("SELECT p FROM Member p WHERE p.email = :email AND p.password = :pw") + Member findWithLogin(String email, String pw); + + default Boolean isExistEmail(Long notthis, String email) { + try{ + return findByEmail(notthis, email).getEmail().equalsIgnoreCase(email); + }catch(Exception e) { + return false; + } + } + + default boolean isExist(Long userid) { + return findById(userid).isPresent(); + } } diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java b/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java deleted file mode 100644 index 30d2262..0000000 --- a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.example.demo.repository; - -import java.sql.PreparedStatement; -import java.util.List; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import com.example.demo.domain.Member; - -@Repository -public class MemberRepositoryJdbc implements MemberRepository { - - private final JdbcTemplate jdbcTemplate; - - public MemberRepositoryJdbc(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private static final RowMapper memberRowMapper = (rs, rowNum) -> new Member( - rs.getLong("id"), - rs.getString("name"), - rs.getString("email"), - rs.getString("password") - ); - - @Override - public List findAll() { - return jdbcTemplate.query(""" - SELECT id, name, email, password - FROM member - """, memberRowMapper); - } - - @Override - public Member findById(Long id) { - return jdbcTemplate.queryForObject(""" - SELECT id, name, email, password - FROM member - WHERE id = ? - """, memberRowMapper, id); - } - - @Override - public Member insert(Member member) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(con -> { - PreparedStatement ps = con.prepareStatement(""" - INSERT INTO member (name, email, password) VALUES (?, ?, ?) - """, new String[]{"id"}); - ps.setString(1, member.getName()); - ps.setString(2, member.getEmail()); - ps.setString(3, member.getPassword()); - return ps; - }, keyHolder); - return findById(keyHolder.getKey().longValue()); - } - - @Override - public Member update(Member member) { - jdbcTemplate.update(""" - UPDATE member - SET name = ?, email = ? - WHERE id = ? - """, member.getName(), member.getEmail(), member.getId()); - return findById(member.getId()); - } - - @Override - public void deleteById(Long id) { - jdbcTemplate.update(""" - DELETE FROM member - WHERE id = ? - """, id); - } -} diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java b/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java deleted file mode 100644 index b4cf722..0000000 --- a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.example.demo.repository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -import com.example.demo.domain.Member; - -public class MemberRepositoryMemory implements MemberRepository { - - private static final Map members = new HashMap<>(); - private static final AtomicLong autoincrement = new AtomicLong(1); - - static { - // 1번 유저를 미리 만들어둔다. - members.put(autoincrement.getAndIncrement(), new Member("최준호", "temp@gmail.com", "password")); - } - - @Override - public List findAll() { - return members.entrySet().stream() - .map(it -> { - Member member = it.getValue(); - member.setId(it.getKey()); - return member; - }).toList(); - } - - @Override - public Member findById(Long id) { - return members.getOrDefault(id, null); - } - - @Override - public Member insert(Member member) { - long id = autoincrement.getAndIncrement(); - members.put(id, member); - member.setId(id); - return member; - } - - @Override - public Member update(Member member) { - return members.put(member.getId(), member); - } - - @Override - public void deleteById(Long id) { - members.remove(id); - } -} diff --git a/src/main/java/com/example/demo/repository/Repository.java b/src/main/java/com/example/demo/repository/Repository.java new file mode 100644 index 0000000..75066a1 --- /dev/null +++ b/src/main/java/com/example/demo/repository/Repository.java @@ -0,0 +1,30 @@ +package com.example.demo.repository; + +import java.util.List; + +public class Repository { + + public List findAll() { + return null; + } + + public T findById(Long id) { + return null; + } + + public T insert(T entity) { + return null; + } + + public void deleteById(Long id) { + } + + public T update(T entity) { + return null; + } + + public boolean isExist(Long id) { + return false; + } + +} diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index 7f8610b..dbf14e5 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -2,18 +2,18 @@ import java.util.List; +import com.example.demo.repository.ArticleRepository; +import com.example.demo.repository.BoardRepository; +import com.example.demo.repository.MemberRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.controller.dto.request.ArticleCreateRequest; import com.example.demo.controller.dto.response.ArticleResponse; import com.example.demo.controller.dto.request.ArticleUpdateRequest; -import com.example.demo.domain.Article; -import com.example.demo.domain.Board; -import com.example.demo.domain.Member; -import com.example.demo.repository.ArticleRepository; -import com.example.demo.repository.BoardRepository; -import com.example.demo.repository.MemberRepository; +import com.example.demo.entity.Article; +import com.example.demo.entity.Board; +import com.example.demo.entity.Member; @Service @Transactional(readOnly = true) @@ -34,49 +34,57 @@ public ArticleService( } public ArticleResponse getById(Long id) { - Article article = articleRepository.findById(id); - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); - return ArticleResponse.of(article, member, board); + Article article = articleRepository.findById(id).get(); + return ArticleResponse.of(article); } public List getByBoardId(Long boardId) { - List
articles = articleRepository.findAllByBoardId(boardId); + List
articles = boardRepository.findById(boardId).get().getArticles(); return articles.stream() - .map(article -> { - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); - return ArticleResponse.of(article, member, board); - }) + .map(ArticleResponse::of)//인텔리제이가 이렇게 바꿔주더라구요. .toList(); } @Transactional public ArticleResponse create(ArticleCreateRequest request) { + Member member = memberRepository.findById(request.authorId()).get(); + Board board = boardRepository.findById(request.boardId()).get(); Article article = new Article( - request.authorId(), - request.boardId(), + member, + board, request.title(), request.description() ); + article.convenienceMethod(member, board); Article saved = articleRepository.insert(article); - Member member = memberRepository.findById(saved.getAuthorId()); - Board board = boardRepository.findById(saved.getBoardId()); - return ArticleResponse.of(saved, member, board); + return ArticleResponse.of(saved); + } + + public boolean isExist(Long id) { + return articleRepository.isExist(id); } @Transactional public ArticleResponse update(Long id, ArticleUpdateRequest request) { - Article article = articleRepository.findById(id); - article.update(request.boardId(), request.title(), request.description()); + Member member = memberRepository.findById(request.authorId()).get(); + Board board = boardRepository.findById(request.boardId()).get(); + Article article = articleRepository.findById(id).get(); + article.update(member, board, request.title(), request.description()); + article.convenienceMethod(member, board); Article updated = articleRepository.update(article); - Member member = memberRepository.findById(updated.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); - return ArticleResponse.of(article, member, board); + return ArticleResponse.of(updated); } @Transactional public void delete(Long id) { articleRepository.deleteById(id); } + + public Boolean isExistBoard(Long boardid) { + return boardRepository.isExist(boardid); + } + + public Boolean isExistUser(Long userid) { + return memberRepository.isExist(userid); + } } diff --git a/src/main/java/com/example/demo/service/BoardService.java b/src/main/java/com/example/demo/service/BoardService.java index ffff891..2f4e163 100644 --- a/src/main/java/com/example/demo/service/BoardService.java +++ b/src/main/java/com/example/demo/service/BoardService.java @@ -2,14 +2,14 @@ import java.util.List; +import com.example.demo.repository.BoardRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.controller.dto.request.BoardCreateRequest; import com.example.demo.controller.dto.request.BoardUpdateRequest; import com.example.demo.controller.dto.response.BoardResponse; -import com.example.demo.domain.Board; -import com.example.demo.repository.BoardRepository; +import com.example.demo.entity.Board; @Service @Transactional(readOnly = true) @@ -28,7 +28,7 @@ public List getBoards() { } public BoardResponse getBoardById(Long id) { - Board board = boardRepository.findById(id); + Board board = boardRepository.findById(id).get(); return BoardResponse.from(board); } @@ -46,9 +46,13 @@ public void deleteBoard(Long id) { @Transactional public BoardResponse update(Long id, BoardUpdateRequest request) { - Board board = boardRepository.findById(id); + Board board = boardRepository.findById(id).get(); board.update(request.name()); Board updated = boardRepository.update(board); return BoardResponse.from(updated); } + + public boolean isExist(Long id) { + return boardRepository.isExist(id); + } } diff --git a/src/main/java/com/example/demo/service/LoginService.java b/src/main/java/com/example/demo/service/LoginService.java new file mode 100644 index 0000000..1c6142d --- /dev/null +++ b/src/main/java/com/example/demo/service/LoginService.java @@ -0,0 +1,51 @@ +package com.example.demo.service; + +import com.example.demo.controller.dto.request.MemberCreateRequest; +import com.example.demo.controller.dto.response.ArticleResponse; +import com.example.demo.controller.dto.response.MemberResponse; +import com.example.demo.entity.Article; +import com.example.demo.entity.Member; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.repository.ArticleRepository; +import com.example.demo.repository.MemberRepository; +import com.example.demo.util.SHA; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@Service +public class LoginService { + + private final MemberRepository memberRepository; + + public LoginService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public Member getMemberWithLogin(String email, String pw) throws HTTPApiException { + return memberRepository.findWithLogin(email, SHA.sha3_512(pw)); + } + + public boolean isExistEmail(String email) { + return memberRepository.isExistEmail(-1L, email); + } + + @Transactional + public void create(MemberCreateRequest request) throws HTTPApiException { + Member member = memberRepository.insert( + new Member(request.name(), request.email(), SHA.sha3_512(request.password())) + ); + } + + public List getByMemberId(Long memberId) { + List
articles = memberRepository.findById(memberId).get().getArticles(); + return articles.stream() + .map(ArticleResponse::of)//인텔리제이가 이렇게 바꿔주더라구요. + .toList(); + } + +} diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 04c1bc8..e5b26f9 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -2,17 +2,20 @@ import java.util.List; +import com.example.demo.entity.Article; +import com.example.demo.exception.HTTPApiException; +import com.example.demo.repository.MemberRepository; +import com.example.demo.util.SHA; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.controller.dto.request.MemberCreateRequest; import com.example.demo.controller.dto.request.MemberUpdateRequest; import com.example.demo.controller.dto.response.MemberResponse; -import com.example.demo.domain.Member; -import com.example.demo.repository.MemberRepository; +import com.example.demo.entity.Member; @Service -@Transactional(readOnly = true) +//@Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; @@ -22,7 +25,7 @@ public MemberService(MemberRepository memberRepository) { } public MemberResponse getById(Long id) { - Member member = memberRepository.findById(id); + Member member = memberRepository.findById(id).get(); return MemberResponse.from(member); } @@ -34,9 +37,9 @@ public List getAll() { } @Transactional - public MemberResponse create(MemberCreateRequest request) { + public MemberResponse create(MemberCreateRequest request) throws HTTPApiException { Member member = memberRepository.insert( - new Member(request.name(), request.email(), request.password()) + new Member(request.name(), request.email(), SHA.sha3_512(request.password())) ); return MemberResponse.from(member); } @@ -48,9 +51,17 @@ public void delete(Long id) { @Transactional public MemberResponse update(Long id, MemberUpdateRequest request) { - Member member = memberRepository.findById(id); + Member member = memberRepository.findById(id).get(); member.update(request.name(), request.email()); memberRepository.update(member); return MemberResponse.from(member); } + + public boolean isExistEmail(Long notthis, String email) { + return memberRepository.isExistEmail(notthis, email); + } + + public boolean isExistUser(Long userid) { + return memberRepository.isExist(userid); + } } diff --git a/src/main/java/com/example/demo/util/SHA.java b/src/main/java/com/example/demo/util/SHA.java new file mode 100644 index 0000000..6b57da1 --- /dev/null +++ b/src/main/java/com/example/demo/util/SHA.java @@ -0,0 +1,20 @@ +package com.example.demo.util; + +import com.example.demo.exception.ExceptionType; +import com.example.demo.exception.HTTPApiException; +import org.apache.tomcat.util.codec.binary.Base64; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +public class SHA { + public static String sha3_512(String text) throws HTTPApiException { + try{ + MessageDigest md = MessageDigest.getInstance("SHA3-512"); + md.update(text.getBytes(StandardCharsets.UTF_8)); + return Base64.encodeBase64String(md.digest()); + }catch(Exception e) { + throw new HTTPApiException(ExceptionType.Server_Error); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff69a9e..e034a0b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,5 +2,5 @@ spring: datasource: url: jdbc:mysql://localhost:3306/bcsd # 본인의 환경에 맞게 수정한다. username: root # 본인의 환경에 맞게 수정한다. - password: qwer1234 # 본인의 환경에 맞게 수정한다. + password: 1234 # 본인의 환경에 맞게 수정한다. driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..707768e --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,17 @@ + + + + + Login + + +

Login form

+
+ +

+ +

+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/showmethearticles.html b/src/main/resources/templates/showmethearticles.html new file mode 100644 index 0000000..8ec708e --- /dev/null +++ b/src/main/resources/templates/showmethearticles.html @@ -0,0 +1,15 @@ + + + + + My Articles + + +

My Articles

+ +

title

+

content

+

created

edited


+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/sign.html b/src/main/resources/templates/sign.html new file mode 100644 index 0000000..8bf8591 --- /dev/null +++ b/src/main/resources/templates/sign.html @@ -0,0 +1,19 @@ + + + + + Sign + + +

Sign form

+
+ +

+ +

+ +

+ +
+ + \ No newline at end of file