diff --git a/.gitignore b/.gitignore index c2065bc..1c025ab 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,176 @@ out/ ### VS Code ### .vscode/ + +# Created by https://www.toptal.com/developers/gitignore/api/windows,intellij,java +# Edit at https://www.toptal.com/developers/gitignore?templates=windows,intellij,java + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +#비번 적힌 곳 +application.yml + +# End of https://www.toptal.com/developers/gitignore/api/windows,intellij,java \ No newline at end of file diff --git a/build.gradle b/build.gradle index 728ec9c..2a46d0f 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,12 @@ java { sourceCompatibility = '17' } +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + repositories { mavenCentral() } @@ -19,8 +25,13 @@ 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' runtimeOnly 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e644113..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/src/main/java/com/example/demo/Exception/ArticleExist.java b/src/main/java/com/example/demo/Exception/ArticleExist.java new file mode 100644 index 0000000..3063db5 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/ArticleExist.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class ArticleExist extends RuntimeException{ + public ArticleExist(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/ArticleNotFound.java b/src/main/java/com/example/demo/Exception/ArticleNotFound.java new file mode 100644 index 0000000..ea6a3cd --- /dev/null +++ b/src/main/java/com/example/demo/Exception/ArticleNotFound.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class ArticleNotFound extends RuntimeException { + public ArticleNotFound(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/BoardNotFound.java b/src/main/java/com/example/demo/Exception/BoardNotFound.java new file mode 100644 index 0000000..c4ba385 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/BoardNotFound.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class BoardNotFound extends RuntimeException { + public BoardNotFound(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/EmailExist.java b/src/main/java/com/example/demo/Exception/EmailExist.java new file mode 100644 index 0000000..6a985e3 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/EmailExist.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class EmailExist extends RuntimeException { + public EmailExist(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/ErrorCode.java b/src/main/java/com/example/demo/Exception/ErrorCode.java new file mode 100644 index 0000000..1e9fb86 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/ErrorCode.java @@ -0,0 +1,29 @@ +package com.example.demo.Exception; + +import lombok.Getter; + +@Getter +public enum ErrorCode { + + Article_Not_Found(404,"NOT_FOUND","게시물을 찾을 수 없습니다."), + Board_Not_Found(404,"NOT_FOUND","게시판을 찾을 수 없습니다."), + Member_Not_Found(404,"NOT_FOUND","사용자를 찾을 수 없습니다."), + + Email_Exist(409,"Exist","이미 이메일이 존재합니다."), + Fail_Member(400,"FAIL","사용자를 참조할 수 없습니다."), + Fail_Board(400,"FAIL","게시판을 참조할 수 없습니다."), + + Null_Exist(400,"NULL","빈(Null) 값이 존재합니다."), + + Remain_Article(400,"REMAIN","게시물이 남아있습니다."); + + private final int code_id; + private final String code; + private final String message; + + ErrorCode(int code_id, String code, String message) { + this.code_id = code_id; + this.code = code; + this.message = message; + } +} diff --git a/src/main/java/com/example/demo/Exception/ErrorResponse.java b/src/main/java/com/example/demo/Exception/ErrorResponse.java new file mode 100644 index 0000000..4f5d174 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/ErrorResponse.java @@ -0,0 +1,25 @@ +package com.example.demo.Exception; + +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +public class ErrorResponse { + private final LocalDateTime timestamp=LocalDateTime.now(); + private int code_id; + private String code; + private String message; + + public ErrorResponse(ErrorCode errorCode) { + this.code_id = errorCode.getCode_id(); + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + + public ErrorResponse(ErrorCode errorCode, String message) { + this.code_id = errorCode.getCode_id(); + this.code = errorCode.getCode(); + this.message = message; + } +} diff --git a/src/main/java/com/example/demo/Exception/FailBoard.java b/src/main/java/com/example/demo/Exception/FailBoard.java new file mode 100644 index 0000000..d6b340b --- /dev/null +++ b/src/main/java/com/example/demo/Exception/FailBoard.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class FailBoard extends RuntimeException{ + public FailBoard(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/FailMember.java b/src/main/java/com/example/demo/Exception/FailMember.java new file mode 100644 index 0000000..df6406f --- /dev/null +++ b/src/main/java/com/example/demo/Exception/FailMember.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class FailMember extends RuntimeException{ + public FailMember(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/GlobalExceptionHandler.java b/src/main/java/com/example/demo/Exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..78fc3f8 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/GlobalExceptionHandler.java @@ -0,0 +1,57 @@ +package com.example.demo.Exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(ArticleNotFound.class) + public ResponseEntity handleArticleNotFound(ArticleNotFound articleNotFound) { + ErrorResponse response=new ErrorResponse(ErrorCode.Article_Not_Found); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(BoardNotFound.class) + public ResponseEntity handleBoardNotFound(BoardNotFound boardNotFound) { + ErrorResponse response=new ErrorResponse(ErrorCode.Board_Not_Found); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(MemberNotFound.class) + public ResponseEntity handleMemberNotFound(MemberNotFound memberNotFound) { + ErrorResponse response=new ErrorResponse(ErrorCode.Member_Not_Found); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(EmailExist.class) + public ResponseEntity handleEmailExist(EmailExist emailExist) { + ErrorResponse response=new ErrorResponse(ErrorCode.Email_Exist); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(FailMember.class) + public ResponseEntity handleFailMember(FailMember failMember) { + ErrorResponse response=new ErrorResponse(ErrorCode.Fail_Member); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(FailBoard.class) + public ResponseEntity handleFailBoard(FailBoard failBoard) { + ErrorResponse response=new ErrorResponse(ErrorCode.Fail_Board); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(NullExist.class) + public ResponseEntity handleNullExist(NullExist nullExist) { + ErrorResponse response=new ErrorResponse(ErrorCode.Null_Exist); + return ResponseEntity.status(response.getCode_id()).body(response); + } + + @ExceptionHandler(ArticleExist.class) + public ResponseEntity handleArticleExist(ArticleExist articleExist) { + ErrorResponse response=new ErrorResponse(ErrorCode.Remain_Article); + return ResponseEntity.status(response.getCode_id()).body(response); + } +} diff --git a/src/main/java/com/example/demo/Exception/MemberNotFound.java b/src/main/java/com/example/demo/Exception/MemberNotFound.java new file mode 100644 index 0000000..0524e25 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/MemberNotFound.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class MemberNotFound extends RuntimeException { + public MemberNotFound(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/Exception/NullExist.java b/src/main/java/com/example/demo/Exception/NullExist.java new file mode 100644 index 0000000..1376950 --- /dev/null +++ b/src/main/java/com/example/demo/Exception/NullExist.java @@ -0,0 +1,7 @@ +package com.example.demo.Exception; + +public class NullExist extends RuntimeException{ + public NullExist(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/demo/domain/Article.java b/src/main/java/com/example/demo/domain/Article.java index e0183db..1318358 100644 --- a/src/main/java/com/example/demo/domain/Article.java +++ b/src/main/java/com/example/demo/domain/Article.java @@ -1,85 +1,79 @@ package com.example.demo.domain; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + import java.time.LocalDateTime; +@Entity +@Table(name="article") +@Getter +@Setter public class Article { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Long authorId; - private Long boardId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id", nullable = false) + private Board board; + + @Column(name="title", nullable=false) private String title; + + @Column(name="content", nullable=false) private String content; + + @Column(name="created_date", nullable=false) private LocalDateTime createdAt; + + @Column(name="modified_date", nullable=false) private LocalDateTime modifiedAt; public Article( Long id, - Long authorId, - Long boardId, + Member member, + Board board, String title, String content, LocalDateTime createdAt, LocalDateTime modifiedAt ) { this.id = id; - this.authorId = authorId; - this.boardId = boardId; + this.member = member; + this.board = board; this.title = title; this.content = content; this.createdAt = createdAt; this.modifiedAt = modifiedAt; } - public Article(Long authorId, Long boardId, String title, String content) { + public Article(Member member, Board board, String title, String content) { this.id = null; - this.authorId = authorId; - this.boardId = boardId; + this.member = member; + this.board = board; 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 Article() { - public String getTitle() { - return title; } - public String getContent() { - return content; + public void update(Board board, String title, String description) { + this.board = board; + this.title = title; + this.content = description; + this.modifiedAt = LocalDateTime.now(); } - 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 index 992e2c6..bb9f8c6 100644 --- a/src/main/java/com/example/demo/domain/Board.java +++ b/src/main/java/com/example/demo/domain/Board.java @@ -1,10 +1,28 @@ package com.example.demo.domain; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name="board") +@Getter +@Setter public class Board { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Column(name="name", nullable=false) private String name; + @OneToMany(mappedBy = "board") + private List
articles=new ArrayList<>(); + public Board(Long id, String name) { this.id = id; this.name = name; @@ -14,19 +32,19 @@ public Board(String name) { this.name = name; } - public Long getId() { - return id; + public Board() { + } - public void setId(Long id) { - this.id = id; + public void update(String name) { + this.name = name; } - public String getName() { - return name; + public void addArticle(Article article) { + articles.add(article); } - public void update(String name) { - this.name = name; + public void removeArticle(Article article) { + articles.remove(article); } } diff --git a/src/main/java/com/example/demo/domain/Member.java b/src/main/java/com/example/demo/domain/Member.java index fe80d6b..5ce4333 100644 --- a/src/main/java/com/example/demo/domain/Member.java +++ b/src/main/java/com/example/demo/domain/Member.java @@ -1,12 +1,34 @@ package com.example.demo.domain; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name="members") +@Getter +@Setter public class Member { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Column(name="name", nullable = false) private String name; + + @Column(name="email", nullable = false) private String email; + + @Column(name="password", nullable = false) private String password; + @OneToMany(mappedBy = "member") + private List
articles = new ArrayList<>(); + public Member(Long id, String name, String email, String password) { this.id = id; this.name = name; @@ -20,28 +42,21 @@ public Member(String name, String email, String password) { this.password = password; } - public void update(String name, String email) { - this.name = name; - this.email = email; - } + public Member() { - public void setId(Long id) { - this.id = id; } - public Long getId() { - return id; + public void update(String name, String email) { + this.name = name; + this.email = email; } - public String getName() { - return name; + public void addArticle(Article article) { + articles.add(article); } - public String getEmail() { - return email; + public void removeArticle(Article article) { + articles.remove(article); } - public String getPassword() { - return password; - } } diff --git a/src/main/java/com/example/demo/repository/ArticleRepository.java b/src/main/java/com/example/demo/repository/ArticleRepository.java index be3ebd4..2034efa 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepository.java +++ b/src/main/java/com/example/demo/repository/ArticleRepository.java @@ -3,20 +3,11 @@ import java.util.List; import com.example.demo.domain.Article; +import org.springframework.data.jpa.repository.JpaRepository; -public interface ArticleRepository { - - List
findAll(); +public interface ArticleRepository extends JpaRepository { List
findAllByBoardId(Long boardId); List
findAllByMemberId(Long memberId); - - Article findById(Long id); - - Article insert(Article article); - - Article update(Article article); - - void deleteById(Long 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..ea9a362 100644 --- a/src/main/java/com/example/demo/repository/BoardRepository.java +++ b/src/main/java/com/example/demo/repository/BoardRepository.java @@ -1,18 +1,8 @@ package com.example.demo.repository; -import java.util.List; - import com.example.demo.domain.Board; +import org.springframework.data.jpa.repository.JpaRepository; -public interface BoardRepository { - - List findAll(); - - Board findById(Long id); - - Board insert(Board board); - - void deleteById(Long id); +public interface BoardRepository extends JpaRepository { - Board update(Board 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..eed4ae4 100644 --- a/src/main/java/com/example/demo/repository/MemberRepository.java +++ b/src/main/java/com/example/demo/repository/MemberRepository.java @@ -1,18 +1,8 @@ package com.example.demo.repository; -import java.util.List; - import com.example.demo.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberRepository { - - List findAll(); - - Member findById(Long id); - - Member insert(Member member); - - Member update(Member member); - - void deleteById(Long id); +public interface MemberRepository extends JpaRepository { + boolean existsByEmail(String email); } diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java b/src/main/java/com/example/demo/repository/NotUse/Jdbc/ArticleRepositoryJdbc.java similarity index 50% rename from src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java rename to src/main/java/com/example/demo/repository/NotUse/Jdbc/ArticleRepositoryJdbc.java index c9a272e..0a5494d 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/NotUse/Jdbc/ArticleRepositoryJdbc.java @@ -1,8 +1,11 @@ -package com.example.demo.repository; +/* package com.example.demo.repository; import java.sql.PreparedStatement; import java.util.List; +import java.util.Optional; +import com.example.demo.Exception.ArticleNotFound; +import com.example.demo.Exception.NullExist; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -21,13 +24,13 @@ public ArticleRepositoryJdbc(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() + 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 @@ -57,52 +60,90 @@ public List
findAllByMemberId(Long memberId) { } @Override - public Article findById(Long id) { - return jdbcTemplate.queryForObject(""" + public Optional
findById(Long id) { + try { + Article article = jdbcTemplate.queryForObject(""" SELECT id, board_id, author_id, title, content, created_date, modified_date FROM article WHERE id = ? """, articleRowMapper, id); + return Optional.ofNullable(article); + } catch (Exception e) { + return Optional.empty(); + } } @Override public Article insert(Article article) { + if (article.getBoardId() == null) { + throw new NullExist("게시판 아이디가 존재하지 않습니다."); + } + if (article.getAuthorId() == null) { + throw new NullExist("사용자 아이디가 존재하지 않습니다."); + } + if (article.getTitle() == null) { + throw new NullExist("제목이 존재하지 않습니다."); + } + if (article.getContent() == null) { + throw new NullExist("내용이 존재하지 않습니다."); + } KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { PreparedStatement ps = con.prepareStatement(""" INSERT INTO article (board_id, author_id, title, content) VALUES (?, ?, ?, ?) """, - new String[]{"id"}); + 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()); + return findById(keyHolder.getKey().longValue()).orElseThrow(()->new ArticleNotFound("게시글을 찾을 수 없습니다.")); } @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() + UPDATE article + SET board_id = ?, title = ?, content = ? + WHERE id = ? + """, + article.getBoardId(), + article.getTitle(), + article.getContent(), + article.getId() ); - return findById(article.getId()); + return findById(article.getId()).orElseThrow(()-> new ArticleNotFound("게시글을 찾을 수 없습니다.")); } @Override public void deleteById(Long id) { jdbcTemplate.update(""" - DELETE FROM article - WHERE id = ? - """, id); + DELETE FROM article + WHERE id = ? + """, id); + } + + @Override + public boolean existByAuthorId(Long authorId) { + Integer count=jdbcTemplate.queryForObject(""" + SELECT COUNT(*) + FROM article + WhERE author_id=? + """,Integer.class,authorId); + return count !=null && count>0; + } + + @Override + public boolean existByBoardId(Long boardId) { + Integer count =jdbcTemplate.queryForObject(""" + SELECT COUNT(*) + FROM article + WHERE author_id=? + """,Integer.class,boardId); + return count !=null && count>0; } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java b/src/main/java/com/example/demo/repository/NotUse/Jdbc/BoardRepositoryJdbc.java similarity index 71% rename from src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java rename to src/main/java/com/example/demo/repository/NotUse/Jdbc/BoardRepositoryJdbc.java index c4fd6f6..407f0df 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/NotUse/Jdbc/BoardRepositoryJdbc.java @@ -1,8 +1,12 @@ -package com.example.demo.repository; +/* package com.example.demo.repository; import java.sql.PreparedStatement; import java.util.List; +import java.util.Optional; +import com.example.demo.Exception.BoardNotFound; +import com.example.demo.Exception.NullExist; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -34,16 +38,24 @@ public List findAll() { } @Override - public Board findById(Long id) { - return jdbcTemplate.queryForObject(""" + public Optional findById(Long id) { + try{ + Board board =jdbcTemplate.queryForObject(""" SELECT id, name FROM board WHERE id = ? """, boardRowMapper, id); + return Optional.ofNullable(board); + } catch(Exception e){ + return Optional.empty(); + } } @Override public Board insert(Board board) { + if (board.getName()==null) { + throw new NullExist("게시판의 이름이 존재하지 않습니다."); + } KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { PreparedStatement ps = con.prepareStatement(""" @@ -52,7 +64,7 @@ INSERT INTO board (name) VALUES (?) ps.setString(1, board.getName()); return ps; }, keyHolder); - return findById(keyHolder.getKey().longValue()); + return findById(keyHolder.getKey().longValue()).orElseThrow(()->new BoardNotFound("게시판을 찾을 수 없습니다.")); } @Override @@ -70,3 +82,4 @@ public Board update(Board board) { ); } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java b/src/main/java/com/example/demo/repository/NotUse/Jdbc/MemberRepositoryJdbc.java similarity index 57% rename from src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java rename to src/main/java/com/example/demo/repository/NotUse/Jdbc/MemberRepositoryJdbc.java index 30d2262..86f76e2 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryJdbc.java +++ b/src/main/java/com/example/demo/repository/NotUse/Jdbc/MemberRepositoryJdbc.java @@ -1,8 +1,12 @@ -package com.example.demo.repository; +/* package com.example.demo.repository; import java.sql.PreparedStatement; import java.util.List; +import java.util.Optional; +import com.example.demo.Exception.MemberNotFound; +import com.example.demo.Exception.NullExist; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -31,49 +35,71 @@ public MemberRepositoryJdbc(JdbcTemplate jdbcTemplate) { public List findAll() { return jdbcTemplate.query(""" SELECT id, name, email, password - FROM member + FROM members """, memberRowMapper); } @Override - public Member findById(Long id) { - return jdbcTemplate.queryForObject(""" + public Optional findById(Long id) { + try{ + Member member = jdbcTemplate.queryForObject(""" SELECT id, name, email, password - FROM member + FROM members WHERE id = ? """, memberRowMapper, id); + return Optional.ofNullable(member); + } catch(Exception e) { + return Optional.empty(); + } } @Override public Member insert(Member member) { + if (member.getName()==null) { + throw new NullExist("이름이 존재하지 않습니다."); + } + if (member.getEmail()==null) { + throw new NullExist("이메일이 존재하지 않습니다."); + } KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(con -> { PreparedStatement ps = con.prepareStatement(""" - INSERT INTO member (name, email, password) VALUES (?, ?, ?) + INSERT INTO members (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()); + return findById(keyHolder.getKey().longValue()).orElseThrow(()->new MemberNotFound("사용자를 찾을 수 없습니다.")); } @Override public Member update(Member member) { jdbcTemplate.update(""" - UPDATE member + UPDATE members SET name = ?, email = ? WHERE id = ? """, member.getName(), member.getEmail(), member.getId()); - return findById(member.getId()); + return findById(member.getId()).orElseThrow(()->new MemberNotFound("사용자를 찾을 수 없습니다.")); } @Override public void deleteById(Long id) { jdbcTemplate.update(""" - DELETE FROM member + DELETE FROM members WHERE id = ? """, id); } + + @Override + public boolean existByEmail(String email) { + Integer count=jdbcTemplate.queryForObject(""" + SELECT COUNT(*) + FROM members + WHERE email=? + """,Integer.class,email); + return count!=null&&count>0; + } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/NotUse/Jpa/ArticleRepositoryJpa.java b/src/main/java/com/example/demo/repository/NotUse/Jpa/ArticleRepositoryJpa.java new file mode 100644 index 0000000..1929746 --- /dev/null +++ b/src/main/java/com/example/demo/repository/NotUse/Jpa/ArticleRepositoryJpa.java @@ -0,0 +1,70 @@ +/* package com.example.demo.repository.Jpa; + +import com.example.demo.domain.Article; +import com.example.demo.repository.ArticleRepository; +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class ArticleRepositoryJpa implements ArticleRepository { + + private final EntityManager em; + + public ArticleRepositoryJpa(EntityManager em) { + this.em = em; + } + + @Override + public List
findAll() { + return em.createQuery("select a from Article a", Article.class).getResultList(); + } + + @Override + public List
findAllByBoardId(Long boardId) { + return em.createQuery("SELECT a from Article a where a.boardId=:boardId",Article.class).setParameter("boardId", boardId).getResultList(); + } + + @Override + public List
findAllByMemberId(Long memberId) { + return em.createQuery("select a from Article a where a.authorId=:memberId",Article.class).setParameter("memberId", memberId).getResultList(); + } + + @Override + public Optional
findById(Long id) { + return Optional.ofNullable(em.find(Article.class, id)); + } + + @Override + public Article insert(Article article) { + em.persist(article); + return article; + } + + @Override + public Article update(Article article) { + return em.merge(article); + } + + @Override + public void deleteById(Long id) { + Article article = em.find(Article.class, id); + if (article != null) { + em.remove(article); + } + } + + @Override + public boolean existByAuthorId(Long authorId) { + return false; + } + + @Override + public boolean existByBoardId(Long boardId) { + return false; + } + +} +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/NotUse/Jpa/BoardRepositoryJpa.java b/src/main/java/com/example/demo/repository/NotUse/Jpa/BoardRepositoryJpa.java new file mode 100644 index 0000000..64cacd2 --- /dev/null +++ b/src/main/java/com/example/demo/repository/NotUse/Jpa/BoardRepositoryJpa.java @@ -0,0 +1,44 @@ +/* package com.example.demo.repository.Jpa; + +import com.example.demo.domain.Board; +import com.example.demo.repository.BoardRepository; +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class BoardRepositoryJpa implements BoardRepository { + + private EntityManager em; + + public BoardRepositoryJpa(EntityManager em) { + this.em = em; + } + + public List findAll() { + return em.createQuery("select b from Board b", Board.class).getResultList(); + } + + public Optional findById(Long id) { + return Optional.ofNullable(em.find(Board.class, id)); + } + + public Board insert(Board board) { + em.persist(board); + return board; + } + + public Board update(Board board) { + return em.merge(board); + } + + public void deleteById(Long id) { + Board b = em.find(Board.class,id); + if(b!=null) { + em.remove(b); + } + } +} +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/NotUse/Jpa/MemberRepositoryJpa.java b/src/main/java/com/example/demo/repository/NotUse/Jpa/MemberRepositoryJpa.java new file mode 100644 index 0000000..368a53a --- /dev/null +++ b/src/main/java/com/example/demo/repository/NotUse/Jpa/MemberRepositoryJpa.java @@ -0,0 +1,50 @@ +/* package com.example.demo.repository.Jpa; + +import com.example.demo.domain.Member; +import com.example.demo.repository.MemberRepository; +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class MemberRepositoryJpa implements MemberRepository { + + private EntityManager em; + + public MemberRepositoryJpa(EntityManager em) { + this.em = em; + } + + public List findAll() { + return em.createQuery("select m from Member m", Member.class).getResultList(); + } + + public Optional findById(Long id) { + return Optional.ofNullable(em.find(Member.class, id)); + } + + + public Member insert(Member member) { + em.persist(member); + return member; + } + + public Member update(Member member) { + return em.merge(member); + } + + public void deleteById(Long id) { + Member m=em.find(Member.class, id); + if (m!=null) { + em.remove(m); + } + } + + @Override + public boolean existByEmail(String email) { + return false; + } +} +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java b/src/main/java/com/example/demo/repository/NotUse/memory/ArticleRepositoryMemory.java similarity index 80% rename from src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java rename to src/main/java/com/example/demo/repository/NotUse/memory/ArticleRepositoryMemory.java index 13ba78b..b367bca 100644 --- a/src/main/java/com/example/demo/repository/ArticleRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/NotUse/memory/ArticleRepositoryMemory.java @@ -1,11 +1,13 @@ -package com.example.demo.repository; +/* package com.example.demo.repository.memory; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import com.example.demo.domain.Article; +import com.example.demo.repository.ArticleRepository; public class ArticleRepositoryMemory implements ArticleRepository { @@ -45,8 +47,8 @@ public List
findAllByMemberId(Long memberId) { } @Override - public Article findById(Long id) { - return articles.getOrDefault(id, null); + public Optional
findById(Long id) { + return Optional.ofNullable(articles.getOrDefault(id, null)); } @Override @@ -67,4 +69,15 @@ public Article update(Article article) { public void deleteById(Long id) { articles.remove(id); } + + @Override + public boolean existByAuthorId(Long authorId) { + return false; + } + + @Override + public boolean existByBoardId(Long boardId) { + return false; + } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java b/src/main/java/com/example/demo/repository/NotUse/memory/BoardRepositoryMemory.java similarity index 82% rename from src/main/java/com/example/demo/repository/BoardRepositoryMemory.java rename to src/main/java/com/example/demo/repository/NotUse/memory/BoardRepositoryMemory.java index 8cf5ecf..aad82d8 100644 --- a/src/main/java/com/example/demo/repository/BoardRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/NotUse/memory/BoardRepositoryMemory.java @@ -1,11 +1,13 @@ -package com.example.demo.repository; +/* package com.example.demo.repository.memory; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import com.example.demo.domain.Board; +import com.example.demo.repository.BoardRepository; public class BoardRepositoryMemory implements BoardRepository { @@ -28,8 +30,8 @@ public List findAll() { } @Override - public Board findById(Long id) { - return boards.getOrDefault(id, null); + public Optional findById(Long id) { + return Optional.ofNullable(boards.getOrDefault(id, null)); } @Override @@ -48,3 +50,4 @@ public Board update(Board board) { return boards.put(board.getId(), board); } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java b/src/main/java/com/example/demo/repository/NotUse/memory/MemberRepositoryMemory.java similarity index 78% rename from src/main/java/com/example/demo/repository/MemberRepositoryMemory.java rename to src/main/java/com/example/demo/repository/NotUse/memory/MemberRepositoryMemory.java index b4cf722..8fb30a5 100644 --- a/src/main/java/com/example/demo/repository/MemberRepositoryMemory.java +++ b/src/main/java/com/example/demo/repository/NotUse/memory/MemberRepositoryMemory.java @@ -1,11 +1,13 @@ -package com.example.demo.repository; +/* package com.example.demo.repository.memory; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import com.example.demo.domain.Member; +import com.example.demo.repository.MemberRepository; public class MemberRepositoryMemory implements MemberRepository { @@ -28,8 +30,8 @@ public List findAll() { } @Override - public Member findById(Long id) { - return members.getOrDefault(id, null); + public Optional findById(Long id) { + return Optional.ofNullable(members.getOrDefault(id, null)); } @Override @@ -49,4 +51,10 @@ public Member update(Member member) { public void deleteById(Long id) { members.remove(id); } + + @Override + public boolean existByEmail(String email) { + return false; + } } +*/ \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/ArticleService.java b/src/main/java/com/example/demo/service/ArticleService.java index 7f8610b..2aee0fa 100644 --- a/src/main/java/com/example/demo/service/ArticleService.java +++ b/src/main/java/com/example/demo/service/ArticleService.java @@ -2,6 +2,7 @@ import java.util.List; +import com.example.demo.Exception.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,9 +35,9 @@ public ArticleService( } public ArticleResponse getById(Long id) { - Article article = articleRepository.findById(id); - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + Article article = articleRepository.findById(id).orElseThrow(() -> new ArticleNotFound("게시글을 찾을 수 없습니다.")); + Member member = memberRepository.findById(article.getMember().getId()).orElseThrow(()-> new MemberNotFound("사용자를 찾을 수 없습니다.")); + Board board = boardRepository.findById(article.getBoard().getId()).orElseThrow(()->new BoardNotFound("게시판을 찾을 수 없습니다.")); return ArticleResponse.of(article, member, board); } @@ -44,8 +45,8 @@ public List getByBoardId(Long boardId) { List
articles = articleRepository.findAllByBoardId(boardId); return articles.stream() .map(article -> { - Member member = memberRepository.findById(article.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + Member member = memberRepository.findById(article.getMember().getId()).orElseThrow(()-> new MemberNotFound("사용자를 찾을 수 없습니다.")); + Board board = boardRepository.findById(article.getBoard().getId()).orElseThrow(()->new BoardNotFound("게시판을 찾을 수 없습니다.")); return ArticleResponse.of(article, member, board); }) .toList(); @@ -53,30 +54,45 @@ public List getByBoardId(Long boardId) { @Transactional public ArticleResponse create(ArticleCreateRequest request) { + Member member = memberRepository.findById(request.authorId()).orElseThrow(()->new FailMember("사용자를 찾을 수 없습니다.")); + Board board = boardRepository.findById(request.boardId()).orElseThrow(()->new FailBoard("게시판을 찾을 수 없습니다.")); + Article article = new Article( - request.authorId(), - request.boardId(), - request.title(), - request.description() + member, + board, + request.title(), + request.description() ); - Article saved = articleRepository.insert(article); - Member member = memberRepository.findById(saved.getAuthorId()); - Board board = boardRepository.findById(saved.getBoardId()); + + member.addArticle(article); + board.addArticle(article); + + Article saved = articleRepository.save(article); + return ArticleResponse.of(saved, member, board); } @Transactional public ArticleResponse update(Long id, ArticleUpdateRequest request) { - Article article = articleRepository.findById(id); - article.update(request.boardId(), request.title(), request.description()); - Article updated = articleRepository.update(article); - Member member = memberRepository.findById(updated.getAuthorId()); - Board board = boardRepository.findById(article.getBoardId()); + Board board = boardRepository.findById(request.boardId()).orElseThrow(()->new FailBoard("게시판을 찾을 수 없습니다.")); + + Article article=articleRepository.findById(id).orElseThrow(()->new ArticleNotFound("게시글을 찾을 수 없습니다.")); + + article.update(board, request.title(), request.description()); + Article updated = articleRepository.save(article); + + Member member = memberRepository.findById(updated.getMember().getId()).orElseThrow(()->new FailMember("사용자를 찾을 수 없습니다.")); return ArticleResponse.of(article, member, board); } @Transactional public void delete(Long id) { + Article article =articleRepository.findById(id).orElseThrow(()->new ArticleNotFound("게시글을 찾을 수 없습니다.")); + Member member =article.getMember(); + Board board = article.getBoard(); + + member.removeArticle(article); + board.removeArticle(article); articleRepository.deleteById(id); } } diff --git a/src/main/java/com/example/demo/service/BoardService.java b/src/main/java/com/example/demo/service/BoardService.java index ffff891..d2cb05d 100644 --- a/src/main/java/com/example/demo/service/BoardService.java +++ b/src/main/java/com/example/demo/service/BoardService.java @@ -2,6 +2,9 @@ import java.util.List; +import com.example.demo.Exception.ArticleExist; +import com.example.demo.Exception.BoardNotFound; +import com.example.demo.repository.ArticleRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,9 +19,11 @@ public class BoardService { private final BoardRepository boardRepository; + private final ArticleRepository articleRepository; - public BoardService(BoardRepository boardRepository) { + public BoardService(BoardRepository boardRepository, ArticleRepository articleRepository) { this.boardRepository = boardRepository; + this.articleRepository = articleRepository; } public List getBoards() { @@ -28,27 +33,29 @@ public List getBoards() { } public BoardResponse getBoardById(Long id) { - Board board = boardRepository.findById(id); + Board board = boardRepository.findById(id).orElseThrow(() -> new BoardNotFound("게시판을 찾을 수 없습니다.")); return BoardResponse.from(board); } @Transactional public BoardResponse createBoard(BoardCreateRequest request) { Board board = new Board(request.name()); - Board saved = boardRepository.insert(board); + Board saved = boardRepository.save(board); return BoardResponse.from(saved); } @Transactional public void deleteBoard(Long id) { + if (articleRepository.findAllByBoardId(id) !=null ) + throw new ArticleExist("게시물이 존재합니다."); boardRepository.deleteById(id); } @Transactional public BoardResponse update(Long id, BoardUpdateRequest request) { - Board board = boardRepository.findById(id); + Board board = boardRepository.findById(id).orElseThrow(()->new BoardNotFound("게시판을 찾을 수 없습니다.")); board.update(request.name()); - Board updated = boardRepository.update(board); + Board updated = boardRepository.save(board); return BoardResponse.from(updated); } } diff --git a/src/main/java/com/example/demo/service/MemberService.java b/src/main/java/com/example/demo/service/MemberService.java index 04c1bc8..32a229a 100644 --- a/src/main/java/com/example/demo/service/MemberService.java +++ b/src/main/java/com/example/demo/service/MemberService.java @@ -1,7 +1,13 @@ package com.example.demo.service; import java.util.List; +import java.util.Objects; +import com.example.demo.Exception.ArticleExist; +import com.example.demo.Exception.EmailExist; +import com.example.demo.Exception.MemberNotFound; +import com.example.demo.repository.ArticleRepository; +import com.example.demo.repository.MemberRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,13 +22,15 @@ public class MemberService { private final MemberRepository memberRepository; + private final ArticleRepository articleRepository; - public MemberService(MemberRepository memberRepository) { + public MemberService(MemberRepository memberRepository, ArticleRepository articleRepository) { this.memberRepository = memberRepository; + this.articleRepository = articleRepository; } public MemberResponse getById(Long id) { - Member member = memberRepository.findById(id); + Member member = memberRepository.findById(id).orElseThrow(()-> new MemberNotFound("사용자를 찾을 수 없습니다.")); return MemberResponse.from(member); } @@ -35,7 +43,7 @@ public List getAll() { @Transactional public MemberResponse create(MemberCreateRequest request) { - Member member = memberRepository.insert( + Member member = memberRepository.save( new Member(request.name(), request.email(), request.password()) ); return MemberResponse.from(member); @@ -43,14 +51,21 @@ public MemberResponse create(MemberCreateRequest request) { @Transactional public void delete(Long id) { + if (articleRepository.findAllByMemberId(id) !=null) { + throw new ArticleExist("게시물이 존재합니다."); + } memberRepository.deleteById(id); } @Transactional public MemberResponse update(Long id, MemberUpdateRequest request) { - Member member = memberRepository.findById(id); + Member member = memberRepository.findById(id).orElseThrow(()-> new MemberNotFound("사용자를 찾을 수 없습니다.")); + if(!member.getEmail().equals(request.email())&&memberRepository.existsByEmail(request.email())) { + throw new EmailExist("이메일이 이미 존재합니다."); + } + member.update(request.name(), request.email()); - memberRepository.update(member); + memberRepository.save(member); return MemberResponse.from(member); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index ff69a9e..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/bcsd # 본인의 환경에 맞게 수정한다. - username: root # 본인의 환경에 맞게 수정한다. - password: qwer1234 # 본인의 환경에 맞게 수정한다. - driver-class-name: com.mysql.cj.jdbc.Driver