Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1c2bb44
자기소개 작성
hyunseong0307 May 9, 2025
d17c235
응답코드 없는 CRUD작성
hyunseong0307 May 9, 2025
6a0e82e
5주차 과제 완성
hyunseong0307 May 11, 2025
3a28a03
모든 article을 보여주는 코드와 json을 보여주는 코드 추가 및 모델생성
hyunseong0307 May 12, 2025
c3de8a6
view작성 및 controller 수정
hyunseong0307 May 12, 2025
a36bda3
모델 및 html파일 수정, controller는 수정중
hyunseong0307 May 19, 2025
662939f
모델 정의 및 API 1번 구조 작성
hyunseong0307 May 20, 2025
c85af65
board 모델 수정
hyunseong0307 May 20, 2025
d229067
API 1번 구현, 미완성
hyunseong0307 May 20, 2025
7dc0b89
7주차 완료 및 예외처리 클래스 정의
hyunseong0307 May 25, 2025
3a3a5be
예외처리 완료
hyunseong0307 May 25, 2025
31c7db2
MemberDao 작성
hyunseong0307 May 25, 2025
8e653f1
member에 관한 로직 작성 및 예외처리
hyunseong0307 May 25, 2025
a597233
Member관련 JPA로 수정
hyunseong0307 May 31, 2025
ad2aaa6
9주차 완료
hyunseong0307 Jun 2, 2025
b6e4d9d
Member 연관관계 매핑 적용
hyunseong0307 Jun 23, 2025
55af08c
Board 연관관계 매핑 적용
hyunseong0307 Jun 23, 2025
773ebe9
dao를 삭제하고 respository로 대체, memberService 수정
hyunseong0307 Jun 23, 2025
92d02f2
PostService 수정
hyunseong0307 Jun 23, 2025
1722721
로그인, 회원가입 html 작성
hyunseong0307 Jun 30, 2025
c2fce43
session 인증방식 사용을 위한 DTO 생성
hyunseong0307 Jun 30, 2025
5484541
controller 완성
hyunseong0307 Jun 30, 2025
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
11 changes: 10 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,19 @@ repositories {
}

dependencies {
// Spring Boot 핵심
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'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'

}

tasks.named('test') {
Expand Down
20 changes: 0 additions & 20 deletions src/main/java/com/example/bcsd/HelloController.java

This file was deleted.

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

import com.example.bcsd.models.Article;
import com.example.bcsd.services.PostService;
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 PostService postService;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Article 관련인데 ArticleService가 아닌 이유가 있을까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Article 관련인데 ArticleService가 아닌 이유가 있을까요?

html에 보여줄때 post html을 같이 사용해서 따로 분리하지 않고 post에 같이 넣어둔건데 분리하겠습니다!


public ArticleController(PostService postService) {
this.postService = postService;
}

@GetMapping
public List<Article> getArticlesByBoard(@RequestParam("boardId") int boardId) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은ResponseEntity 적용이 안되어 있는 이유가 있나요??

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DTO 도 알아보고 적용하면 좋을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DTO 도 알아보고 적용하면 좋을 것 같아요!

이 부분에 관해서 살짝 이해가 안되는 부분이 있던데, 모델을 작성하는것과 DTO의 큰 차이가 뭔지 잘 모르겠습니다.

return postService.getArticlesByBoard(boardId);
}

@GetMapping("/{id}")
public Article getArticle(@PathVariable int id) {
return postService.getArticleById(id);
}

@PostMapping
public ResponseEntity<Void> createArticle(@RequestBody Article article) {
postService.createArticle(article);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@PutMapping("/{id}")
public ResponseEntity<Void> updateArticle(@PathVariable int id, @RequestBody Article article) {
postService.updateArticle(id, article);
return ResponseEntity.ok().build();
}

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

import com.example.bcsd.models.Member;
import com.example.bcsd.services.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

private final MemberService memberService;

@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
Comment on lines +18 to +21
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 주입 방법의 장점이 뭘까요?


@PostMapping
public ResponseEntity<Member> createMember(@RequestBody Member member) {
Member created = memberService.createMember(member);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}

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

@GetMapping
public ResponseEntity<List<Member>> getAllMembers() {
return ResponseEntity.ok(memberService.getAllMembers());
}

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

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

import com.example.bcsd.services.PostService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;



@Controller
public class PostController {
private final PostService postService;

public PostController(PostService postService) {
this.postService = postService;
}

@GetMapping("/posts")
public String getPosts(@RequestParam int boardId, Model model) {
model.addAttribute("boardName", postService.getBoardName(boardId));
model.addAttribute("articles", postService.getArticlesByBoard(boardId));
return "posts";
}
}

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

import com.example.bcsd.dtos.LoginDto;
import com.example.bcsd.dtos.SignupDto;
import com.example.bcsd.models.Member;
import com.example.bcsd.repositories.MemberRepository;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@Controller
@RequiredArgsConstructor
public class SessionController {

private final MemberRepository memberRepository;

@GetMapping("/login")
public String loginForm() {
return "login";
}
@GetMapping("/signup")
public String signupForm() {
return "signup"; // templates/login.html 파일 필요
}

@PostMapping("/signup")
public String signup(SignupDto request) {
if (!request.getPassword().equals(request.getConfirmPassword())) {
return "비밀번호가 일치하지 않습니다.";
}

if (memberRepository.findByAccount(request.getAccount()).isPresent()) {
return "이미 존재하는 계정입니다.";
}

Member member = new Member();
member.setAccount(request.getAccount());
member.setPassword(request.getPassword());
member.setEmail(request.getEmail());
member.setName(request.getName());
memberRepository.save(member);

return "redirect:/login";
}

@PostMapping("/login")
public String login(LoginDto request, HttpSession session) {
Optional<Member> optionalMember = memberRepository.findByAccount(request.getAccount());

if (optionalMember.isEmpty()) return "존재하지 않는 계정입니다.";
Member member = optionalMember.get();

if (!member.getPassword().equals(request.getPassword())) {
return "비밀번호가 틀렸습니다.";
}

session.setAttribute("loginMember", member); // 세션 저장
return "redirect:/";
}
}
54 changes: 54 additions & 0 deletions src/main/java/com/example/bcsd/daos/ArticleDAO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*package com.example.bcsd.daos;

import com.example.bcsd.models.Article;
import org.springframework.stereotype.Repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;

import java.util.List;

@Repository
public class ArticleDAO {

@PersistenceContext
private EntityManager em;

public Article findById(int id) {
return em.find(Article.class, id);
}

public List<Article> findByBoardId(int boardId) {
return em.createQuery("SELECT a FROM Article a WHERE a.boardId = :boardId", Article.class)
.setParameter("boardId", boardId)
.getResultList();
}

public void insert(Article article) {
em.persist(article);
}

public void update(int id, Article article) {
Article target = em.find(Article.class, id);
if (target != null) {
target.setBoardId(article.getBoardId());
target.setTitle(article.getTitle());
target.setContent(article.getContent());
target.setUpdatedAt(java.time.LocalDateTime.now());
}
}

public void delete(int id) {
Article article = em.find(Article.class, id);
if (article != null) {
em.remove(article);
}
}

public int countByAuthorId(int authorId) {
Long count = em.createQuery("SELECT COUNT(a) FROM Article a WHERE a.authorId = :authorId", Long.class)
.setParameter("authorId", authorId)
.getSingleResult();
return count.intValue();
}
}
*/
30 changes: 30 additions & 0 deletions src/main/java/com/example/bcsd/daos/BoardDAO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
package com.example.bcsd.daos;


import com.example.bcsd.models.Board;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;


@Repository
public class BoardDAO {

@PersistenceContext
private EntityManager em;

public Optional<String> findNameById(int id) {
List<String> names = em.createQuery("SELECT b.name FROM Board b WHERE b.id = :id", String.class)
.setParameter("id", id)
.getResultList();
return names.stream().findFirst();
}
}
*/
51 changes: 51 additions & 0 deletions src/main/java/com/example/bcsd/daos/MemberDAO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
package com.example.bcsd.daos;

import com.example.bcsd.models.Member;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public class MemberDAO {

@PersistenceContext
private EntityManager em;

public Member findById(int id) {
return em.find(Member.class, id);
}

public List<Member> findAll() {
return em.createQuery("SELECT m FROM Member m", Member.class).getResultList();
}

public void insert(Member member) {
em.persist(member);
}

public void update(Member member) {
Member target = em.find(Member.class, member.getId());
if (target != null) {
target.setName(member.getName());
target.setEmail(member.getEmail());
}
}

public void delete(int id) {
Member member = em.find(Member.class, id);
if (member != null) {
em.remove(member);
}
}
public Optional<Member> findByEmail(String email) {
List<Member> result = em.createQuery("SELECT m FROM Member m WHERE m.email = :email", Member.class)
.setParameter("email", email)
.getResultList();
return result.stream().findFirst();
}
}
*/
10 changes: 10 additions & 0 deletions src/main/java/com/example/bcsd/dtos/LoginDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.bcsd.dtos;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class LoginDto {
private String account;
private String password;
}
13 changes: 13 additions & 0 deletions src/main/java/com/example/bcsd/dtos/SignupDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.bcsd.dtos;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class SignupDto {
private String account;
private String password;
private String confirmPassword;
private String email;
private String name;
}
Loading