본문 바로가기

Framework/SpringBoot

[Spring Boot] JPA로 게시판 구현하기

1. 프로젝트 생성과 설정

dependencies 추가

 

✔ build.gradle과 application.properties 설정은 지난 포스트와 동일

2023.11.28 - [Framework/SpringBoot] - [Spring Boot] JPA Repository

 

[Spring Boot] JPA Repository

1. 프로젝트 생성 및 설정 1) bulid.gradle 2) application.properties server.port = 8081 # JSP spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp # oracle set spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasou

100ke.tistory.com

▶ 설정 부분 참고

 

2. 코드 작성

패키지 및 폴더 구성

위의 구조로 작성하겠습니다.

 

1) DTO

toEntity() 메서드는 게시글 등록시에 id는 db에서 자동생성되므로 null로 지정하고, 게시글을 수정할 때는 id로 변경한다.

@AllArgsConstructor
@ToString
public class ArticleForm {
	private Long id;
	private String title;
	private String content;
	
	public Article toEntity() {
		
		return new Article(null, title, content);
	}
}

 

2) Entity

@Entity
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
public class Article {
	@Id
	@GeneratedValue // db가 id를 자동 생성
	private Long id;
	
	@Column
	private String title;
	@Column
	private String content;
}

 

 

3) Repository

interface ArticleRepository

@Repository
public interface ArticleRepository extends CrudRepository<Article, Long>{
	@Override
	ArrayList<Article> findAll();
}

 

4) Controller

@Controller
public class ArticleController {
	@Autowired
	private ArticleRepository articleRepository;
	
	@GetMapping("/articles/new")
	public String newArticleForm() {
		return "/articles/new";
	}
	
	@PostMapping("/articles/create")
	public String newArticle(ArticleForm form) {
		// dto를 엔티티로 변환
		Article article = form.toEntity();
		
		// repository에 엔티티 저장
		Article saved = articleRepository.save(article);
		
		return "redirect:/articles/" + saved.getId();
	}
	
	@GetMapping("/articles/{id}")
	public String show(@PathVariable Long id, Model model) {
		Article articleEntity = articleRepository.findById(id).orElse(null);
		
		model.addAttribute("article", articleEntity);
		return "articles/show";
	}
	
	@GetMapping("/articles")
	public String index(Model model) {
		List<Article> articleEnList = articleRepository.findAll();
		model.addAttribute("list", articleEnList);
		return "articles/index";
	}
	
	@GetMapping("/articles/{id}/edit")
	public String edit(@PathVariable Long id, Model model) {
		Article articleEntity = articleRepository.findById(id).orElse(null);
		model.addAttribute("id", id);
		model.addAttribute("article", articleEntity);
		return "articles/edit";
	}
	
	@PostMapping("/articles/update")
	public String update(ArticleForm form) {
		Article articleEntity = form.toEntity();
		Article target = articleRepository.findById(articleEntity.getId()).orElse(null);
		if(target != null) {
			articleRepository.save(articleEntity);
		}
		return "redirect:/articles/" + articleEntity.getId();
	}
	
	@GetMapping("/articles/{id}/delete")
	public String delete(@PathVariable Long id, RedirectAttributes rttr) {
		Article target = articleRepository.findById(id).orElse(null);
		if(target != null) {
			articleRepository.delete(target);
			rttr.addFlashAttribute("msg", "데이터 삭제");
		}
		return "redirect:/articles";
	}
}

 

3. 화면 처리 및 구동 확인

1) index.jsp

서버 처음 구동 시 DB에 테이블이 생성된 것을 확인할 수 있다.

테이블 1회 생성 후 create >> none 변경

 

 

2) new.jsp

내용을 작성한 뒤 [글자 입력] 버튼으로 게시글을 등록

 

3) show.jsp

위에서 작성한 결과가 db에 등록되어 show.jsp 를 통해 화면에 출력이 된다.

 

4) edit.jsp

작성된 게시글 수정 전에 [com.study.springboot.dto] 패키지의 ArticleForm 을 다음과 같이 수정

null 에서 id로 수정
수정 버튼으로 게시글 수정
수정된 결과가 db에 반영되어&nbsp; show.jsp 를 통해 화면에 출력이 된다.

 

5) 삭제

게시글 삭제는 따로 화면에 나타내는 페이지는 없으며 url주소에 삭제할 게시글의 id 번호를 입력받아 삭제한다.

삭제 전의 데이터와 index.jsp 페이지
url에 삭제할 id값 입력
삭제된 결과가 db에 반영되며 index.jsp 페이지로 이동되어 게시글 목록을 확인 가능