반응형
청춘고양이
배움을 기록하는 곳
청춘고양이
전체 방문자
오늘
어제
  • Hello World (119)
    • JQuery (5)
    • In my opinion (4)
    • HTML&CSS (8)
    • JS (9)
    • JAVA (21)
    • Spring Boot (21)
    • Node.js (1)
    • Linux (7)
    • Git (2)
    • Kotlin (4)
    • Fluttor (4)
    • 정보처리기사 (19)
    • AWS (1)
    • Oracle (8)
    • MySQL (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 쉬프트 연산
  • js 비밀번호
  • 제이쿼리 비밀번호
  • 청춘고양이
  • 중복 제거 로또
  • spring 기본설정
  • 가위바위보js
  • 제이쿼리 패스워드 변경
  • 자바db연동
  • 제이쿼리 버튼클릭시 색 변경
  • js
  • css
  • js 패스워드 변경
  • 초보개발
  • 제이쿼리
  • ScrollEffectJs
  • 스크롤js
  • 자바
  • js 로또 번호
  • 객체 안의 함수

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청춘고양이

배움을 기록하는 곳

스프링 부트에서 @Transactional을 활용한 트랜잭션 관리
Spring Boot

스프링 부트에서 @Transactional을 활용한 트랜잭션 관리

2024. 6. 21. 15:59
반응형

트랜잭션 관리는 데이터베이스 작업의 일관성을 보장하고 오류 발생 시 롤백할 수 있도록 하는 중요한 개념입니다. Spring Boot는 이러한 트랜잭션 관리를 쉽게 할 수 있도록 @Transactional 어노테이션을 제공합니다. 이번 포스트에서는 Spring Boot와 MyBatis를 사용하여 트랜잭션 관리를 어떻게 하는지 살펴보겠습니다.


1. @Transactional 소개

@Transactional 어노테이션은 Spring의 트랜잭션 관리 기능을 활성화하기 위해 사용됩니다. 이 어노테이션을 사용하면 지정된 메서드나 클래스 내의 모든 데이터베이스 작업이 하나의 트랜잭션 내에서 수행됩니다. 만약 트랜잭션 내에서 예외가 발생하면, 해당 트랜잭션은 롤백됩니다.


2. Spring Boot 설정

스프링 부트 프로젝트를 설정하고 MyBatis를 추가하는 방법을 간단히 살펴보겠습니다.

2.1. 프로젝트 생성

Spring Initializr를 사용하여 Spring Boot 프로젝트를 생성합니다. 필요한 의존성으로 Spring Web과 MyBatis를 추가합니다.

2.2. Maven 의존성 설정

pom.xml 파일을 다음과 같이 설정합니다.

2.3. 설정 파일

src/main/resources/application.properties 파일을 설정합니다.



3. MyBatis Mapper와 Model 설정

3.1. 모델 클래스

package com.example.demo.model;

public class BlogPost {
    private Long id;
    private String title;
    private String content;
    
    // Getters and Setters
}

3.2. Mapper 인터페이스

package com.example.demo.mapper;

import com.example.demo.model.BlogPost;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface BlogPostMapper {

    @Select("SELECT * FROM blog_post WHERE id = #{id}")
    BlogPost findById(Long id);

    @Select("SELECT * FROM blog_post")
    List<BlogPost> findAll();

    @Insert("INSERT INTO blog_post(title, content) VALUES(#{title}, #{content})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(BlogPost blogPost);

    @Update("UPDATE blog_post SET title = #{title}, content = #{content} WHERE id = #{id}")
    void update(BlogPost blogPost);

    @Delete("DELETE FROM blog_post WHERE id = #{id}")
    void delete(Long id);
}

3.3. MyBatis Mapper XML (Optional)

 



4. 서비스 클래스에 @Transactional 적용

서비스 클래스에서 @Transactional을 사용하여 트랜잭션 관리를 적용합니다.

package com.example.demo.service;

import com.example.demo.mapper.BlogPostMapper;
import com.example.demo.model.BlogPost;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class BlogPostService {

    private final BlogPostMapper blogPostMapper;

    public BlogPostService(BlogPostMapper blogPostMapper) {
        this.blogPostMapper = blogPostMapper;
    }

    @Transactional
    public void createBlogPost(BlogPost blogPost) {
        blogPostMapper.insert(blogPost);
    }

    @Transactional(readOnly = true)
    public BlogPost getBlogPostById(Long id) {
        return blogPostMapper.findById(id);
    }

    @Transactional(readOnly = true)
    public List<BlogPost> getAllBlogPosts() {
        return blogPostMapper.findAll();
    }

    @Transactional
    public void updateBlogPost(BlogPost blogPost) {
        blogPostMapper.update(blogPost);
    }

    @Transactional
    public void deleteBlogPost(Long id) {
        blogPostMapper.delete(id);
    }
}

 



5. 컨트롤러 클래스

컨트롤러 클래스에서 서비스 메서드를 호출합니다.

package com.example.demo.controller;

import com.example.demo.model.BlogPost;
import com.example.demo.service.BlogPostService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/blog")
public class BlogPostController {

    private final BlogPostService blogPostService;

    public BlogPostController(BlogPostService blogPostService) {
        this.blogPostService = blogPostService;
    }

    @PostMapping
    public void createBlogPost(@RequestBody BlogPost blogPost) {
        blogPostService.createBlogPost(blogPost);
    }

    @GetMapping("/{id}")
    public BlogPost getBlogPostById(@PathVariable Long id) {
        return blogPostService.getBlogPostById(id);
    }

    @GetMapping
    public List<BlogPost> getAllBlogPosts() {
        return blogPostService.getAllBlogPosts();
    }

    @PutMapping
    public void updateBlogPost(@RequestBody BlogPost blogPost) {
        blogPostService.updateBlogPost(blogPost);
    }

    @DeleteMapping("/{id}")
    public void deleteBlogPost(@PathVariable Long id) {
        blogPostService.deleteBlogPost(id);
    }
}

 



결론

@Transactional 어노테이션을 사용하면 Spring Boot에서 트랜잭션 관리를 쉽게 구현할 수 있습니다. 데이터베이스 작업의 일관성을 유지하고, 오류 발생 시 롤백을 통해 안전한 데이터 처리를 할 수 있게 됩니다. MyBatis Mapper와 함께 사용하여 간단한 블로그 포스팅 시스템을 구현해보았는데, 이를 통해 트랜잭션 관리의 중요성과 사용법을 이해하는 데 도움이 되었기를 바랍니다.

반응형
저작자표시 변경금지 (새창열림)

'Spring Boot' 카테고리의 다른 글

댓글 시스템 데이터베이스(MySQL) 설계 및 MyBatis를 이용한 댓글 수 조회  (0) 2024.06.24
효율적인 데이터 로딩: Spring Boot과 MyBatis로 구현하는 페이징 처리  (0) 2024.06.21
미디어 관련 공부#3  (0) 2022.09.12
미디어 관련 공부#2  (0) 2022.08.30
미디어 관련 공부#1(DB)  (0) 2022.08.30
    'Spring Boot' 카테고리의 다른 글
    • 댓글 시스템 데이터베이스(MySQL) 설계 및 MyBatis를 이용한 댓글 수 조회
    • 효율적인 데이터 로딩: Spring Boot과 MyBatis로 구현하는 페이징 처리
    • 미디어 관련 공부#3
    • 미디어 관련 공부#2
    청춘고양이
    청춘고양이
    신입개발자

    티스토리툴바