Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b4835ab
feat : 본인 자기소개 추가
Nov 6, 2025
4eea7e9
fix : 주석수정
Nov 6, 2025
11a3cfc
feat : json 기능 추가
Nov 6, 2025
4140621
feat : get 기능 추가
Nov 6, 2025
db6b069
feat : post 기능 추가
Nov 7, 2025
7c27ff1
feat : put 기능 추가
Nov 7, 2025
27b8dd3
feat : delete 기능 추가
Nov 7, 2025
cbe28cc
refactoring : DTO 및 엔티티 분류
Nov 13, 2025
591baac
refactoring : service, repository, controller 분리
Nov 13, 2025
6ed8a8c
feat : member 및 board 및 article 모델 생성
Nov 13, 2025
0bcf9b1
feat : repository 생성
Nov 16, 2025
bd56ae0
feat : DTO 추가 생성
Nov 16, 2025
9702633
feat : service 생성
Nov 16, 2025
38b9ae4
feat : controller 생성
Nov 16, 2025
dd8e583
feat : html 파일 생성
Nov 16, 2025
e1d60f0
feat : jdnc 의존성 추가
Nov 20, 2025
2664939
feat : model 및 DTO 수정
Nov 22, 2025
0bdbfb8
feat : 레포지터리 수정
Nov 22, 2025
616d3d8
feat : 불필요 DTO 삭제
Nov 22, 2025
737be91
feat : 서비스 트랜잭션 기능
Nov 22, 2025
0e904f5
feat : API 및 view 컨트롤러 분리
Nov 22, 2025
715e336
fix : html 수정
Nov 22, 2025
3ef6d12
feat : 예외처리 구현
Nov 30, 2025
827f418
refactor : Repositoy 구현
Nov 30, 2025
3cb1eec
feat : 서비스 예외 처리 구현
Nov 30, 2025
74ea20b
fix : 컨트롤러 수정
Nov 30, 2025
d6d4797
fix : EOF 오류 수정
Nov 30, 2025
ebc356c
fix : 피드백 반영
Dec 21, 2025
d0eabfc
feat : 의존성 추가
Dec 21, 2025
6bc7d3b
fix : 엔티티 수정
Dec 21, 2025
54599a4
fix : 레포지터리 수정
Dec 21, 2025
d91d10d
fix : 엔티티 수정
Dec 28, 2025
56e5f09
fix : 레포지터리 수정
Dec 28, 2025
1158bca
fix : 서비스 수정
Dec 28, 2025
bb754b8
fix : 엔티티 오류 수정
Dec 28, 2025
68cdd72
fix : 의존성 추가
Jan 4, 2026
446d2ca
feat : 로그인 기능 및 검사 기능 추가
Jan 4, 2026
2590817
fix : 로그인 부분 추가
Jan 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.mindrot:jbcrypt:0.4'
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
}

tasks.named('test') {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/example/bcsd/BcsdApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ public static void main(String[] args) {
}

}

28 changes: 28 additions & 0 deletions src/main/java/com/example/bcsd/Config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.bcsd.Config;

import com.example.bcsd.Util.JwtInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

private final JwtInterceptor jwtInterceptor;

public WebConfig(JwtInterceptor jwtInterceptor) {
this.jwtInterceptor = jwtInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(
"/members",
"/members/login",
"/members/**"
);
}
}

48 changes: 48 additions & 0 deletions src/main/java/com/example/bcsd/Controller/ArticleController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.example.bcsd.Controller;

import com.example.bcsd.DTO.Article;
import com.example.bcsd.DTO.ArticleRequestDTO;
import com.example.bcsd.Service.ArticleService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/articles")
public class ArticleController {

private final ArticleService articleService;

public ArticleController(ArticleService articleService) {
this.articleService = articleService;
}

@GetMapping
public ResponseEntity<List<Article>> getAllArticles(@RequestParam(required = false) Long boardId) {
return ResponseEntity.ok(articleService.getAllArticles(boardId));
}

@GetMapping("/{id}")
public ResponseEntity<Article> getArticle(@PathVariable Long id) {
return ResponseEntity.ok(articleService.findArticleById(id));
}

@PostMapping
public ResponseEntity<Article> postArticle(@RequestBody ArticleRequestDTO request) {
Article newArticle = articleService.createArticle(request);
return ResponseEntity.status(HttpStatus.CREATED).body(newArticle);
}

@PutMapping("/{id}")
public ResponseEntity<Article> putArticle(@PathVariable Long id, @RequestBody ArticleRequestDTO request) {
return ResponseEntity.ok(articleService.updateArticle(id, request));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteArticle(@PathVariable Long id) {
articleService.deleteArticle(id);
return ResponseEntity.noContent().build();
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/example/bcsd/Controller/BoardController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.bcsd.Controller;

import com.example.bcsd.DTO.Board;
import com.example.bcsd.Service.BoardService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/boards")
public class BoardController {

private final BoardService boardService;

public BoardController(BoardService boardService) {
this.boardService = boardService;
}

@PostMapping
public ResponseEntity<Board> createBoard(@RequestBody Board board) {
return ResponseEntity.ok(boardService.createBoard(board));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBoard(@PathVariable Long id) {
boardService.deleteBoard(id);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.bcsd;
package com.example.bcsd.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -18,3 +18,4 @@ public String hello2() {
return "hello";
}
}

24 changes: 24 additions & 0 deletions src/main/java/com/example/bcsd/Controller/IntroduceController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.bcsd.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IntroduceController {

//실습 2번입니다.
//@GetMapping("/introduce")
@GetMapping(value = "/introduce", params = "!name")
public String introduce() {
return "introduce";
}

//실습 3번입니다
@GetMapping(value = "/introduce", params = "name")
@ResponseBody
public String introduceGetName(@RequestParam("name") String name) {
return "안녕하세요 제 이름은 " + name + "입니다!";
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/example/bcsd/Controller/JsonController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.bcsd.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonController {

@GetMapping("/json")
public JsonResponse getJson() {
return new JsonResponse(24, "조재민");
}

public record JsonResponse(int age, String name) {
}

}
58 changes: 58 additions & 0 deletions src/main/java/com/example/bcsd/Controller/MemberController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.example.bcsd.Controller;

import com.example.bcsd.DTO.Member;
import com.example.bcsd.Service.MemberService;
import com.example.bcsd.Util.JwtUtil;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/members")
public class MemberController {

private final MemberService memberService;
private final JwtUtil jwtUtil;

public MemberController(MemberService memberService, JwtUtil jwtUtil) {
this.memberService = memberService;
this.jwtUtil = jwtUtil;
}

@PostMapping("/login")
public ResponseEntity<Map<String, String>> login(@RequestBody Map<String, String> loginData) {
String email = loginData.get("email");
String password = loginData.get("password");

Member member = memberService.login(email, password);
String token = jwtUtil.createToken(member.getId());

Map<String, String> response = new HashMap<>();
response.put("token", token);

return ResponseEntity.ok(response);
}

@PostMapping
public ResponseEntity<Member> createMember(@RequestBody Member member) {
return ResponseEntity.ok(memberService.createMember(member));
}

@GetMapping("/{id}")
public ResponseEntity<Member> getMember(@PathVariable Long id) {
return ResponseEntity.ok(memberService.findMember(id));
}

@PutMapping("/{id}")
public ResponseEntity<Member> updateMember(@PathVariable Long id, @RequestBody Member member) {
return ResponseEntity.ok(memberService.updateMember(id, member));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteMember(@PathVariable Long id) {
memberService.deleteMember(id);
return ResponseEntity.ok().build();
}
}
31 changes: 31 additions & 0 deletions src/main/java/com/example/bcsd/Controller/PostController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.example.bcsd.Controller;

import com.example.bcsd.DTO.Article;
import com.example.bcsd.Service.ArticleService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class PostController {

private final ArticleService articleService;

public PostController(ArticleService articleService) {
this.articleService = articleService;
}

@GetMapping("/posts")
public String getPostsView(@RequestParam(required = false) Long boardId, Model model) {
List<Article> articles = articleService.getAllArticles(boardId);
String boardName = articleService.getBoardName(boardId);

model.addAttribute("boardName", boardName);
model.addAttribute("articles", articles);

return "posts";
}
}
49 changes: 49 additions & 0 deletions src/main/java/com/example/bcsd/DTO/Article.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.example.bcsd.DTO;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.sql.Timestamp;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Article {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id", nullable = false)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private Member author;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id", nullable = false)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private Board board;

@Column(nullable = false)
private String title;

@Column(nullable = false)
private String content;

@Column(name = "created_date")
private Timestamp createdDate;

@Column(name = "modified_date")
private Timestamp modifiedDate;

public Article(Member author, Board board, String title, String content) {
this.author = author;
this.board = board;
this.title = title;
this.content = content;
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/example/bcsd/DTO/ArticleRequestDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.bcsd.DTO;

import com.fasterxml.jackson.annotation.JsonProperty;

public record ArticleRequestDTO(
@JsonProperty("board_id") Long boardId,
@JsonProperty("author_id") Long authorId,
String title,
String content
) {
}
33 changes: 33 additions & 0 deletions src/main/java/com/example/bcsd/DTO/Board.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.bcsd.DTO;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
private List<Article> articles = new ArrayList<>();

public Board(String name) {
this.name = name;
}
}

Loading