본문 바로가기
웹/Spring, Django

[Spring]Service

by stubborngastropod 2023. 5. 15.
728x90

비즈니스 로직을 처리하는 서비스 컴포넌트 구현

// QuizService
package com.example.quiz.service;

import com.example.quiz.entity.Quiz;

import java.util.Optional;

public interface QuizService {
    Iterable<Quiz> selectAll();

    Optional<Quiz> selectOneRandomQuiz();

    Boolean checkQuiz(Integer id, Boolean myAnswer);

    void insertQuiz(Quiz quiz);

    void updateQuiz(Quiz quiz);

    void deleteQuizById(Integer id);

}
package com.example.quiz.service;

import com.example.quiz.entity.Quiz;
import com.example.quiz.repository.QuizRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
@Transactional
public class QuizServiceImpl implements QuizService{
    @Autowired
    QuizRepository repository;

    @Override
    public Iterable<Quiz> selectAll() {
        return repository.findAll();
    }

    @Override
    public Optional<Quiz> selectOneRandomQuiz() {
        Integer randId = repository.getRandomId();

        if (randId == null) {
            return Optional.empty();
        }
        return repository.findById(randId);
    }

    @Override
    public Boolean checkQuiz(Integer id, Boolean myAnswer) {
        Boolean check = false;

        Optional<Quiz> optQuiz = repository.findById(id);

        if (optQuiz.isPresent()) {
            Quiz quiz = optQuiz.get();
            if (quiz.getAnswer().equals(myAnswer)) {
                check = true;
            }
        }
        return check;
    }

    @Override
    public void insertQuiz(Quiz quiz) {
        repository.save(quiz);
    }

    @Override
    public void updateQuiz(Quiz quiz) {
        repository.save(quiz);
    }

    @Override
    public void deleteQuizById(Integer id) {
        repository.deleteById(id);
    }
}

이 때 QuizRepository에 getRandomId 메서드를 추가해준다.

@Transactional 어노테이션은 해당 클래스의 모든 메서드에 트랜잭션 제어를 할 수 있도록 해준다.

서비스 인터페이스 만들 때 실수로 놓친 메서드가 있어서 추가해주느라 시간을 좀 잡아먹었다 ^^;

 

서비스 처리를 확인하기 위해 QuizApplication을 다음과 같이 수정해본다.

//QuizApplication
private void setup() {
			Quiz quiz1 = new Quiz(null, "Quiz test 1", true, "nono");
			Quiz quiz2 = new Quiz(null, "Quiz test 2", true, "nono");
			Quiz quiz3 = new Quiz(null, "Quiz test 3", true, "nono");
			Quiz quiz4 = new Quiz(null, "Quiz test 4", true, "nono");
			Quiz quiz5 = new Quiz(null, "Quiz test 5", true, "nono");
			List<Quiz> quizList = new ArrayList<>();
			Collections.addAll(quizList, quiz1, quiz2, quiz3, quiz4, quiz5);
			for (Quiz quiz : quizList) {
				service.insertQuiz(quiz);
			}
		}

private void showList() {
    System.out.println("---All data---");
    Iterable<Quiz> quizzes = service.selectAll();
    for (Quiz quiz : quizzes) {
        System.out.println(quiz);
    }
    System.out.println("--------------");
}

private void showOne() {
    System.out.println("---no1 data---");
    Optional<Quiz> quizOpt = service.selectOneById(1);
    if (quizOpt.isPresent()) {
        System.out.println(quizOpt.get());
    } else {
        System.out.println("No data");
    }
    System.out.println("--------------");
}

private void updateQuiz() {
    System.out.println("---Change data---");
    Quiz quiz1 = new Quiz(1, "Changed question", true, "nunu");
    service.updateQuiz(quiz1);
    System.out.println(quiz1 + "changed");
    System.out.println("-----------------");
}

private void deleteQuiz() {
    System.out.println("---Delete data---");
    service.deleteQuizById(4);
    System.out.println("-----------------");
}

실행 결과

퀴즈를 푸는 로직

// QuizApplication
private void doQuiz() {
    System.out.println("---Random quiz---");
    Optional<Quiz> quizOpt = service.selectOneRandomQuiz();
    if (quizOpt.isPresent()) {
        System.out.println(quizOpt.get());
    } else {
        System.out.println("No data");
    }
    System.out.println("-----------------");

    Boolean myAnswer = false;
    Integer id = quizOpt.get().getId();
    if (service.checkQuiz(id, myAnswer)) {
        System.out.println("Correct");
    } else {
        System.out.println("Wrong");
    }
}

false라고 지정된 myAnswer가 정답인 true와 달라 Wrong이 출력된다.

이로써 도메인 레이어의 준비가 끝났다.

728x90

' > Spring, Django' 카테고리의 다른 글

[Spring]Application Layer  (0) 2023.05.16
[Spring]Application-CRUD  (0) 2023.05.12
[Spring]Request Parameter/Validation  (0) 2023.05.11
[Spring]Thymeleaf 문법, Layout  (0) 2023.05.10
[Spring]JDBC/MVC Model  (0) 2023.05.09

댓글