본문 바로가기

Spring

OX퀴즈 프로그램 - 2(Service)

진행상황

 

- 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이 하나뿐이라

가장 간단하게 쓸수있는 필드에 붙여씀.