본문 바로가기
Web Develop/Book Study

[Book Study] 스프링 프레임워크 첫걸음 - 11. 애플리케이션 만들기 (비즈니스 로직 처리)

by tripleup 2023. 8. 17.
728x90
반응형

[Book Study] Spring Framework 스프링 프레임워크 첫걸음
11. 애플리케이션 만들기 (비즈니스 로직 처리)


 

11 - 1 비즈니스 로직의 처리 내용 확인과 작성

 

 

11 - 2 트랜잭션 관리 알아보기

트랜잭션 - 복수의 처리를 하나의 그룹으로 모은 것

롤백 : 처리 중 싪했을 경우 트랜잭션은 실행 전의 상태로 돌아감

커밋 : 처리가 모두 성공하면 처리가 확정됨

부분적인 성공이나 부분적인 실패라는 것은 없음

 

트랜잭션 경계

- 시작되고 끝나는 위치를 반드시 지정해야 하고, 시작되고 끝날 떄까지의 범위

 

클래스나 메서드에 @Transactional 어노테아션을 부여하면 트랜잭션이 관리되어 트랜잭션의 시작, 커밋, 롤백이 자동으로 실행.

 

클래스에 @Transactional 어노테이션 부여

- 그 클래스의 모든 메서드에 트랜잭션 제어를 설정할 수 있다.

메서드에 @Transactional 어노테이션 부여

- 메서드가 호출되는 타이밍(정확하게는 메서드 시작 전)에 트랜잭션이 시작되어 대상 메서ㅡ가 정상 종료한 경우에는 '커밋', 예외로 종료한 경우에는 '롤백'

 

클래스에 부여하는 것을 추천 -> 트랜잭션 경계의 설정이 필요한 경우는 변경 처리(등록, 변경, 삭제)를 포함한 서비스 처리뿐이지만 설정 실수 등올 인한 버그 등을 방지하는 목적으로 클래스에 부여하는 것을 추천


11 - 3 비즈니스 로직 처리하기


 

package com.example.quiz;

import com.example.quiz.entity.Quiz;
import com.example.quiz.repository.QuizRepository;
import com.example.quiz.service.QuizService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@SpringBootApplication
public class QuizApplication {
	/** 구동 메서드 */
	public static void main(String[] args) {
		SpringApplication.run(QuizApplication.class, args)
				.getBean(QuizApplication.class).execute();
	}

	/** 주입(인젝션) */
	@Autowired
	QuizService service;

	/** 실행 메서드 */
	private void execute() {
		//등록 처리
		//setup();
		//전체 항목 취득
		//showList();
		//1건 취득
		//showOne();
		//변경 처리
		//updateQuiz();
		//삭제 처리
		//deleteQuiz();
		//퀴즈 실행
		doQuiz();
	}

	/** === 퀴즈 2건을 등록합니다 === */
	private void setup() {
		System.out.println("--- 등록 처리 개시 ---");
		//엔티티 생성
		Quiz quiz1 = new Quiz(null, "자바는 객체지향 언어입니다.", true, "등록 담당");
		Quiz quiz2 = new Quiz(null, "스프링 데이터는 데이터 액세스에 관련된 "
				+ "기능을 제공합니다.", true, "등록 담당");
		Quiz quiz3 = new Quiz(null, "프로그램이 많이 등록되어 있는 서버를 "
				+ "라이브러리라고 합니다.", false, "등록 담당");
		Quiz quiz4 = new Quiz(null, "@Component는 인스턴스 생성 어노테이션"
				+ "입니다.", true, "등록 담당");
		Quiz quiz5 = new Quiz(null, "스프링 MVC에서 구현하고 있는 디자인 패턴에서 "
				+ "모든 요청을 하나의 컨트롤러에서 받는 것을"
				+ "싱글 컨트롤러 패턴이라고 합니다.", false, "등록 담당");
		//리스트에 엔티티를 저장
		List<Quiz> quizList = new ArrayList<>();
		//첫 인수에 저장될 객체를, 두 번째 인수부터는 저장할 엔티티를 넘겨줌.
		Collections.addAll(quizList, quiz1, quiz2, quiz3, quiz4, quiz5);

		//등록 실행
		for (Quiz quiz : quizList) {
			//등록 실행
			service.insertQuiz(quiz);
		}
		//등록 확인
		System.out.println("--- 등록 처리 완료 ---");

	}

	/** 모든 데이터 취득 === */
	private void showList() {
		System.out.println("--- 모든 데이터 취득 게시 ---");
		//리포지토리를 이용해 모든 데이터를 취득해서 결과를 반환
		Iterable<Quiz> quizzes = service.selectAll();
		for (Quiz quiz : quizzes) {
			System.out.println(quiz);
		}
		System.out.println("--- 모든 데이터 취득 완료 ---");
	}

	private void showOne() {
		System.out.println("--- 1건 취득 개시 ---");
		//리포지토리를 사용해서 1건의 데이터를 취득해서 결과를 반환(반환값은 Optional)
		Optional<Quiz> quizOpt = service.selectOneById(1);
		//반환값이 있는지 확인
		if (quizOpt.isPresent()) {
			System.out.println(quizOpt.get());
		} else {
			System.out.println("해당 데이터는 존재하지 않습니다.");
		}
		System.out.println("--- 1건 취득 완료 ---");
	}

	/** === 변경 처리 === */
	private void updateQuiz() {
		System.out.println("--- 변경 처리 개시 ---");
		//변경할 엔티티를 생성
		Quiz quiz1 = new Quiz(1,"스프링은 프레잉워크입니까?", true, "변경 담당");
		//변경 처리
		service.updateQuiz(quiz1);
		//변경 결과 확인
		System.out.println("변경된 데이터는 " + quiz1 + "입니다.");
		System.out.println("=== 변경 처리 완료 ===");
	}

	/** === 삭제 처리 === */
	private void deleteQuiz() {
		System.out.println("--- 삭제 처리 개시 ---");
		//삭제 실행
		service.deleteQuizById(2);
		System.out.println("--- 삭제 처리 완료 ---");;
	}

	/** --- 랜덤으로 퀴즈를 취득해서 퀴즈의 정답/오답을 평가 === */
	private void doQuiz() {
		System.out.println(" --- 퀴즈 1건 취득 개시 ---");
		//리포지토리를 이용해서 1건의 데이터를 받기(반환값은 Optional)
		Optional<Quiz> quizOpt = service.selectOneRandomQuiz();
		//반환값이 있는지 확인
		if (quizOpt.isPresent()) {
			System.out.println(quizOpt.get());
		} else {
			System.out.println("해당 데이터는 존재하지 않습니다.");
		}
		System.out.println(" --- 퀴즈 1건 취득 완료 --- ");
		//답 평가
		Boolean myAnswer = false;
		Integer id = quizOpt.get().getId();
		if (service.checkQuiz(id, myAnswer)) {
			System.out.println("정답입니다!!!");
		} else {
			System.out.println("오답입니다.");
		}
	}

}
728x90
반응형

댓글