Spring Boot로 게시판 CRUD 구현하기 (Lombok 활용)

JHLee·2025년 3월 22일

Springboot

목록 보기
3/6

이 글에서는 Lombok 라이브러리를 활용하는 방법과 Spring Boot를 이용하여 게시판 구현에 필요한 CRUD(데이터 생성,조회,수정,삭제) 기능을 핵심 개념 중심으로 정리하였습니다.
📖 참고 자료: 《코딩 자율학습 스프링 부트 3 자바 백엔드 개발 입문》


1. Lombok 소개 및 설치

Lombok은 반복적인 코드 작성을 줄여, 코드 작성과 유지보수를 쉽게 해주는 라이브러리입니다.
자바에서는 getter(), setter(), constructor(), toString()등의 메서드를 매번 작성해야 하는 불편함이 있습니다. Lombok을 사용하면 이러한 필수 메서드를 자동으로 생성해주므로, 코드가 깔끔해지고 유지보수가 쉬워집니다. 또한 로깅 기능을 활용하여 프로그램의 실행 과정을 손쉽게 기록할 수 있습니다.

주요 기능

  • @Getter, @Setter: 필드의 getter/setter 자동 생성
  • @ToString: toString() 메서드를 자동 구현
  • @AllArgsConstructor, @NoArgsConstructor: 생성자를 자동으로 생성
  • @Slf4j: 로그(logging) 기능을 쉽게 사용할 수 있도록 지원

설치방법

  1. build.gradle 파일의 dependencies 블록에 다음 코드를 추가
dependencies {
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
    ...
}
  1. IDE에서 Lombok 플러그인을 활성화하고, 새로고침 아이콘을 클릭하면 Lombok 라이브러리가 자동으로 다운로드됩니다.

2. 데이터베이스와 JPA

  • 데이터베이스(DB) : 행과 열로 구성된 테이블(table)에 데이터를 저장하고 관리하는 공간입니다.
  • DB에 데이터를 기록하려면 SQL(Structured Query Language)언어를 사용해야 합니다. Java는 SQL을 직접 이해하지 못하기 때문에 JPA(Java Persistence API) 를 사용하여 Java 코드로 DB를 조작할 수 있습니다.
  • JPA의 핵심 도구
    - 엔티티(Entity) : Java 객체를 DB 테이블과 매핑하는 개념으로, 이를 기반으로 테이블이 만들어집니다.
    - 리파지터리(Repository) : 엔티티를 DB에 저장하고 관리하는 역할을 하는 인터페이스입니다.
  • 엔티티 예시:
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    private String name;
    @Column
    private String email;
}

3. CRUD란?

CRUD는 데이터의 기본적인 조작 기능을 의미하며, 다음과 같은 네 가지 기능을 포함합니다.

  • Create(생성) : 새로운 데이터 생성
  • Read(조회) : 데이터 조회
  • Update(수정) : 데이터 수정
  • Delete(삭제) : 데이터 삭제

4. 게시판 구현 핵심 흐름

4-1. 새 글 작성 (Create)

1. 폼 데이터 & DTO

  • 사용자가 <form>을 통해 입력한 데이터를 DTO(Data Transfer Object) 에 담아 서버로 전송합니다.
  • 입력 필드에 name 속성을 부여하여 DTO의 필드와 매핑합니다.

2. DTO -> 엔티티 변환

  • DTO 내에 toEntity() 메서드를 구현해, 폼 데이터를 엔티티 객체로 변환한 후 DB에 저장합니다.

3. 리파지터리를 이용해 엔티티를 DB에 저장

  • Spring Data JPA의 CrudRepository를 상속받은 리파지터리를 통해 데이터 생성, 조회, 수정, 삭제 작업을 수행합니다.

  • CrudRepository<Article, Long>
    JPA에서 제공하는 인터페이스로 이를 생성해 엔티티를 관리(생성, 조회, 수정, 삭제)할 수 있습니다. 이는 2개의 제네릭 요소를 받습니다.
    - 첫 번째 제네릭 요소 : 관리 대상 엔티티의 클래스입니다. (Article)
    - 두 번째 제네릭 요소 : 관리 대상 엔티티의 대푯값 타입입니다. (Long)

  • 예시:

public interface ArticleRepository extends CrudRepository<Article, Long> {
    @Override
    ArrayList<Article> findAll();
}
  • 컨트롤러에서 @Autowired 를 통해 리파지터리 객체를 주입(DI)받아 사용합니다.
  • 의존성 주입(DI, Dependency Injection) : 외부에서 생성된 객체를 필요한 곳에서 사용할 수 있도록 하는 기법입니다.

4-2. 게시글 읽기 (Read)

1. 데이터 조회 과정

  1. 사용자 요청: URL(/articles 또는 /articles/{id})을 입력해 서버에 데이터를 요청
  2. 컨트롤러 처리: 컨트롤러가 요청을 받아 필요한 데이터를 리파지터리에 전달
  3. DB 조회: 리파지터리가 DB에서 해당 데이터를 조회하는 쿼리 실행
  4. DB에서 엔티티 반환: 데이터베이스는 조회된 데이터를 엔티티(Entity) 객체로 변환하여 반환
  5. 뷰 템플릿 전달: 반환된 엔티티 객체를 모델(Model)에 담아 뷰(View) 템플릿으로 전달
  6. 화면 출력: 뷰 템플릿이 데이터를 반영한 HTML 페이지를 생성하여 사용자 화면에 출력

2. 단일 데이터 조회

  1. URL 경로에 게시글의 ID를 포함시켜 요청(GET /articles/{id})하면, 해당 ID에 맞는 데이터를 조회합니다.
  • ID를 통해 조회할땐 findById()메서드를 사용합니다. 형식은 다음과 같습니다.
 // 1. id를 조회해 데이터 가져오기
 Article articleEntity = articleRepository.findById(id).orElse(null);    // 값이 없으면 null 저장

2.조회된 데이터를 모델에 등록합니다.

  • 모델에 데이터를 등록할땐 addAttribute() 메서드를 사용합니다. 형식은 다음과 같습니다.
// name이라는 이름으로 value 객체 추가
model.addAttribute(String name, Object value)
  1. 조회된 데이터를 상세보기 페이지(articles/show)에 전달하고 반환합니다.

3. 데이터 목록 조회하기

  • 게시글을 단일 조회하는 것과 다르게, 데이터 목록을 조회할 때는 엔티티의 리스트를 반환합니다.
    이때,
  • 전체 게시글 목록을 조회할 때는 리파지터리의 findAll() 메서드를 활용합니다. 형식은 다음과 같습니다.
// 1. 모든 데이터 가져오기
List<Article> articleEntityList = articleRepository.findAll();
  • ❗️ findAll() 메서드는 기본적으로 Iterable 타입을 반환하는데, 작성한 타입은 List이므로 서로 타입이 불일치한다는 오류가 발생합니다.이를 해결하는 방법은 3가지가 있습니다.

  • 반환 데이터 타입 불일치 문제 해결 방법

  1. 메서드가 반환하는 데이터 타입을 사용자가 원하는 타입으로 캐스팅하기
  2. 사용자가 작성한 데이터 타입을 메서드가 반환하는 타입으로 맞추기
  3. 메서드의 반환 데이터 타입을 원하는 타입으로 오버라이딩하기
  • 조회한 데이터 목록을 모델에 담아 목록 페이지(articles/index)에서 반복문을 통해 출력합니다.

4. 뷰 템플릿

Mustache 문법을 사용하여 데이터를 출력하며, {{#article}}...{{/article}} 또는 {{#articleList}}...{{/articleList}}와 같이 데이터를 반복 출력할 수 있습니다.


4-3. 게시글 수정 (Update)

1. 데이터 수정 과정

  • 기존 데이터를 불러와 수정 폼에 출력한 후, 수정된 데이터를 다시 데이터베이스에 저장하고, 결과 페이지로 리다이렉트합니다.

2. 💡 리다이렉트란?

  • 클라이언트가 보낸 요청을 처리한 후, 다른 페이지로 이동하도록 서버가 다음 요청 주소를 재지시하는 것입니다. 이를 통해 여러 개의 요청을 연결하여 하나의 흐름으로 만들 수 있습니다.

4-3. 게시글 삭제 (Delete)

1. 데이터 삭제 과정

  1. 특정 게시글을 삭제하기 위한 요청 (GET 또는 DELETE)
  2. 리파지터리의 delete() 메서드로 엔티티 삭제
  3. 삭제 후, 삭제 완료 메시지를 전달하여 목록 페이지로 리다이렉트

2. 삭제 완료 메시지

  • addFlashAttribute()메서드를 사용하여 일시적 메시지를 전달할 수 있습니다.
rttr.addFlashAttribute("msg","삭제되었습니다!");	// 삭제 완료 메시지 남기기
profile
개발자로 성장하기

0개의 댓글