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");
}
}
이로써 도메인 레이어의 준비가 끝났다.
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 |
댓글