WEB

Spring Boot와 JPA로 간단한 블로그 앱 만들어보기 (CRUD)

ohs020105 2025. 9. 2. 02:11

이번에는 Spring Boot와 JPA를 활용해 게시글을 생성하고, 조회, 수정, 삭제 하는 기본적인 기술을 공부하는 시간을 가졌습니다.

 

1. 프로젝트 셋업 및 기본 기능

가장 먼저 Gradle을 사용해 Spring Boot 프로젝트를 만들고 웹 개발을 위해 필요한 주요 의존성들을 추가합니다.

 

  • Spring Web: 웹 애플리케이션을 만들 때 필수.
  • Spring Data JPA: 데이터베이스 관리를 쉽게 해주는 도구.
  • MariaDB Driver: 데이터베이스로 MariaDB를 사용하기 위한 드라이버.
  • Thymleaf: HTML 에서 동적으로 데이터를 보여주기 위한 템플릿 엔진.
  • Lombok: getter, setter 등 반복적인 코드를 자동으로 만들어 준다.

그리고 application.properties 파일에 MariaDB 연결 정보를 설정 해줍니다.

spring.datasource.url=jdbc:mariadb://localhost:3306/toy_project_social
spring.datasource.username=유저이름
spring.datasource.password=비밀번호

 

여기서 중요한점.

만약 본인이 github를 사용하면서 comit하는데 이 민감한 데이터를 그대로 올려버리면 다른 사용자도 다 봐버릴수 있게 됩니다.

그러므로 따로 파일 .gitignore 파일을 프로젝트 최상위 폴더에 만들고,

src/main/resources/application.properties 이렇게 추가해줘야 커밋을 할때 민감한 정보가 같이 올라가는걸 방지 해줄 수 있습니다.

 


 

본격적으로 이제 CRUD(create, read, update, delete) 한 걸 설명하겠습니다.

★여기서 처음에 CRUD는 컨트롤러 파일에 만들어 줄겁니다.

이렇게 폴더가 있는걸 확인할 수 있는데 여기서 크게 다룰건 5가지 입니다.

  • controller : 사용자의 원하는 요청을 받고 그 데이터를 반환해주는 역할입니다.
  • dto :  사용자가 입력한 데이터를 dto 객체를 만들어 데이터를 다룰때 편하게 해주는 역할입니다.
  • entity : 데이터베이스에 직접 상호작용을 할 수 있는 역할입니다.
  • repository : 데이터베이스하고 entity 파일이 연결이 원할하게 도와주는 역할입니다.
  • templates : 쉽게 생각해 html 파일을 만드는 곳이라 생각하시면 편합니다.

여기서 저희는 1번째 controller를 먼저 사용해보겠습니다.


이 사진을 보면 위에 @를 붙히고 Controller 이란걸 적는데 이건 Spring Boot의 편의성인 어노테이션이라고 합니다.

이걸 사용하게 되면 "이제 이 파일은 Controller이라는거야 인지해." 라고 인지하고 있게 됩니다.

@RequestMapping은 사용자가 맨 처음에 url을 들어올때 localhost:8080/post 까진 들어올거야 라는걸 말하는 겁니다.

 

그 다음 데이터베이스를 이용해 만드는 거기 때문에 PostRepository라는 새로운 생성자를 만든후 컨트롤러에 의존성 주입을 시켜줍니다.

1. 게시글 생성(Create)

사용자로부터 게시글을 입력받아 데이터베이스에 저장하는 기능을 구현했습니다.

 

요약▼ 

  • @GetMapping("/create") : create_post.html 파일을 반환해 게시글 작성 폼을 보여줍니다.
  • @PostMapping("/create") : 폼에서 제출된 데이터를 받아 PostCreateDto에 자동으로 담습니다.
  • PostRepository.save(post): DTO의 데이터를 Post 엔티티로 변환한 뒤 PostRepository를 이용해 데이터베이스에 저장합니다.

1. @GetMapping("/create") 

 이게 뭐하는거면 쉽게 생각하면 처음 서버를 키고 url을 입력할때 /create 까지 입력하게 된다면 

create_post.html 파일을 반환해 게시글 작성 폼을 보여줍니다.

예시) localhost:8080/post/create

이런식으로 우리가 templates 폴더에 만들어놓은 지정한 경로의 html 파일을 보여주게 되는겁니다.

다음으로는

2. @PostMapping("/create") 

이건 이제 실제로 게시글을 만들때 사용됩니다.

여기서 dto파일을 가져오게 되는데 dto에 있는 내용을 보게 된다면 

이렇게 코드가 적혀 있습니다. 

이걸 쉽게 풀어서 설명하면

lombok 의존성을 이용해 getter, setter를 간편하게 만들어주고 

사용자가 입력한 정보를 이 dto파일에 저장하게 됩니다. 

예를 들자면 )

public String getName() {
	return 대충 사용자의 내용을 반환해줘
}

이런식으로 저장이 된다는 겁니다.

그래서 앞으로 저희가 사용할때 메서드를 편하게 사용할 수 있게 되는 겁니다.

 

다시 이어서 메서드들을 이용해서 생성을 해주면 이제 데이터베이스에 저장하기 위한 순서입니다.

 

this.postRepository.save(post);

이게 post데이터베이스에 저장할거라는 말입니다.

 

이 과정에서 폼 데이터와 DTO의 변수 이름이 정확히 일치해야 데이터 바인딩이 정상적으로 이루어진다는 것을 배웠습니다.

 


2. 게시글 조회(Read)

저장된 게시글을 화면에 보여주는 기능을 만들었습니다.

 

  • 목록 조회: @GetMapping("/list") 를 통해 PostRepository.findAll()로 모든 게시글을 가져옵니다. Model 객체를 사용해 이 데이터를 list.html로 전달하고, **Thymeleaf의 th:each**를 이용해 목록을 반복 출력했습니다.
  • 상세 조회: 게시글 제목을 클릭하면 /post/detail/{id}와 같은 URL로 이동합니다. @PathVariable을 사용해 URL의 {id} 값을 컨트롤러로 가져와 특정 게시글을 조회합니다.


3. 게시글 수정 (Update)

기존 게시글을 수정하는 기능은 두 단계로 나뉘어 구현했습니다.

  • 수정 폼 보여주기: @GetMapping("/fix/{id}")를 만들어 기존 게시글의 데이터를 fix_post.html 폼에 미리 채워 넣었습니다.
  • 수정 내용 저장: @PostMapping("/fix")를 통해 수정된 데이터를 받습니다. JPA는 PostRepository.save()를 호출할 때 객체에 ID가 있으면 자동으로 UPDATE 쿼리를 실행해줍니다. new Post()로 새 객체를 만드는 대신, findById()로 기존 객체를 가져와 수정하는 것이 핵심입니다.

여기선 Thymleaf 를 이용한것인데 html 파일을 보면 알 수 있습니다.

detail html 파일

 


4. 게시글 삭제 (Delete)

마지막으로 삭제 기능은 가장 간단했습니다. @GetMapping("/delete/{id}")를 만들고, PostRepository.deleteById(id) 메소드만 호출하면 해당 ID를 가진 게시글이 데이터베이스에서 삭제됩니다.

delete 삭제 내부 코드


마치면서 해결했던 주요 에러와 배운 점 입니다.

이번 프로젝트를 진행하면서 여러 에러를 겪었는데,

 

1. 404 Not Found (URL 매핑): PostController에 @RequestMapping("/post")가 있는데, 개별 GetMapping에 /post를 또 붙여서 URL이 /post/post/...로 중복되는 오류를 겪었습니다.

 

2. Whitelabel Error (CSRF 토큰): POST 요청이 데이터베이스에 저장되지 않는 문제가 있었습니다. 이는 Spring Security가 기본적으로 CSRF 토큰을 요구하기 때문이며, 보안 설정을 임시로 비활성화하여 해결했습니다.

 

3. 500 Server Error (타입 변환): HTML 폼의 빈 값을 int 타입으로 변환하려다 오류가 발생했습니다. DTO의 int 변수를 Integer로 변경해 null 값을 허용함으로써 해결했습니다.

 

이상으로 마치겠습니다. 앞으로도 열심히 발전하는 개발자가 되겠습니다.

'WEB' 카테고리의 다른 글

자바로 연습용 웹사이트 만들어 보기 1일차  (0) 2025.08.20