- Service 인터페이스(QuizService) 추가
public interface QuizService {
Iterable<Quiz> selectAll();
Optional<Quiz> selectOneById(Integer id);
Optional<Quiz> selectOneRandomQuiz();
Boolean checkQuiz(Integer id, Boolean myAnswer); //정답판정
void insertQuiz(Quiz quiz);
void updateQuiz(Quiz quiz);
void deleteQuizById(Integer id);
}
|
cs |
- 인터페이스의 메소드를 구현할 클래스(QuizServiceImpl) 추가
@Service
@Transactional public class QuizServiceImpl implements QuizService {
@Autowired
QuizRepository repository;
@Override
public Iterable<Quiz> selectAll() {
return repository.findAll();
}
@Override
public Optional<Quiz> selectOneById(Integer id) {
return repository.findById(id);
}
@Override
public Optional<Quiz> selectOneRandomQuiz() {
Integer randomId = repository.getRandomId();
System.out.println(Optional.empty());
if(randomId == null) {
return Optional.empty();
}
return repository.findById(randomId);
}
@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);
}
}
|
cs |
CrudRepository가 기본적으로 제공하는 CRUD메소드만으로 서비스를 구현하려면
따로 Service클래스를 구현하지 않아도 되지만
여기서는 DB에서 랜덤한 문제를 읽어오는 기능과 정답유무를 판별하는 기능을 구현하는
커스텀 메소드selectOneRandomQuiz(), checkQuiz()를 구현해야한다.
Optional<Quiz>
만약 DB로부터 전달받은값이 null이라면 문제가 생길수 있기 때문에
null값까지 처리할수있는 Optional클래스로 래핑한다.
Integer randomId = repository.getRandomId();
getRandomId() 메소드를 QuizRepository에 구현한다.
public interface QuizRepository extends CrudRepository<Quiz, Integer> {
@Query("SELECT id FROM quiz ORDER BY RAND() limit 1")
Integer getRandomId();
}
|
cs |
@Query 어노테이션을 붙이고 SQL문으로 작성한다.
@Transactional
서비스 메소드들이 구동 중에 예외가 발생하면
Spring에서 내부적으로 트랜잭션 처리(Commit, Rollback)를 하도록 @Transactional 어노테이션으로 설정할 수 있다.
@Autowired
의존성 주입(DI) 어노테이션.
생성자나 setter메소드에 붙여쓸수도 있지만 주입할 Bean이 하나뿐이라
가장 간단하게 쓸수있는 필드에 붙여씀.
'Spring' 카테고리의 다른 글
클라이언트-서버간 파라미터 주고받기 (0) | 2022.03.17 |
---|---|
OX퀴즈 프로그램 - 4(Controller) (0) | 2022.02.02 |
OX퀴즈 프로그램 -3(View, Form) - thymeleaf (0) | 2022.01.26 |
OX퀴즈 프로그램 - 1(DB,Entity,Repository) (0) | 2022.01.04 |