728x90
퀴즈 애플리케이션을 만들 때 레이어를 3개로 나누어 개발.
- 애플리케이션 레이어: 클라의 요청을 제어하고 도메인 레이어를 사용해 애플리케이션 제어
- Controller: 요청을 처리에 매핑, 결과를 뷰에 넘김. 주요 처리는 도메인 레이어의 서비스를 호출
- Form: 화면의 폼을 표현, 화면의 입력값을 컨트롤러에 넘기고 컨트롤러에서 화면을 출력할 때도 사용.
- View: 화면 표시
- 도메인 레이어: 도메인 객체에 대해 애플리케이션 서비스 처리 실행
- Domain Object: 서비스 처리에 필요한 자원(Entity 등)
- Service: 애플리케이션의 서비스 처리
- Repository: 인터페이스. 데이터베이스의 데이터 조작 내용 정의
- 인프라스트럭쳐 레이어: 도메인 객체에 대해 CRUD 조작을 통해 데이터의 영속화 담당
- RepositoryImpl: 도메인 레이어에서 정의한 repository의 구현 클래스
- ORM: 객체와 RDB 간의 관계 매핑
pdAdmin4를 통해 퀴즈 데이터베이스 생성
스키마 생성시에 데이터타입을 잘못 지정해줘서 애먹었다! 주의해서 설정하기
entity와 repository를 생성
// entity.Quiz
package com.example.quiz.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Quiz {
@Id
private Integer id;
private String question;
private Boolean answer;
private String author;
}
// repository.QuizRepository
package com.example.quiz.repository;
import com.example.quiz.entity.Quiz;
import org.springframework.data.repository.CrudRepository;
public interface QuizRepository extends CrudRepository<Quiz, Integer> {
}
데이터 등록
// QuizApplication
package com.example.quiz;
import com.example.quiz.entity.Quiz;
import com.example.quiz.repository.QuizRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuizApplication {
public static void main(String[] args) {
SpringApplication.run(QuizApplication.class, args)
.getBean(QuizApplication.class).execute();
}
@Autowired
QuizRepository repository;
private void execute() {
setup();
}
private void setup() {
Quiz quiz1 = new Quiz(null, "Is Spring framework?", true, "nono");
quiz1 = repository.save(quiz1);
Quiz quiz2 = new Quiz(null, "Does Spring MVC provide batch process?", false, "nono");
quiz2 = repository.save(quiz2);
}
}
위와 같이 수동으로 등록해준 데이터 확인
데이터 취득
// QuizApplication
private void execute() {
setup();
showList();
}
private void showList() {
System.out.println("---All data---");
Iterable<Quiz> quizzes = repository.findAll();
for (Quiz quiz: quizzes) {
System.out.println(quiz);
}
System.out.println("--------------");
}
CrudRepository에서 상속된 save() 메서드는 @id 어노테이션이 부여한 필드가 null인 경우 INSERT를, 그렇지 않은 경우는 UPDATE를 실행하므로 같은 질문이 두개씩 저장되어 있는 것을 볼 수 있다.
단일 데이터를 취득할 수도 있다.
// QuizApplication
private void showList() {
System.out.println("---All data---");
Iterable<Quiz> quizzes = repository.findAll();
for (Quiz quiz: quizzes) {
System.out.println(quiz);
}
System.out.println("--------------");
}
데이터 수정
// QuizApplication
private void updateQuiz() {
System.out.println("---Change data---");
Quiz quiz1 = new Quiz(1, "Changed question", true, "nunu");
quiz1 = repository.save(quiz1);
System.out.println(quiz1 + "changed");
System.out.println("-----------------");
}
데이터 삭제
// QuizApplication
private void deleteQuiz() {
System.out.println("---Delete data---");
repository.deleteById(4);
System.out.println("-----------------");
}
오늘은 Domain Object, Repository, RepositoryImpl, ORM을 구현해봤다.
728x90
'웹 > Spring, Django' 카테고리의 다른 글
[Spring]Application Layer (0) | 2023.05.16 |
---|---|
[Spring]Service (1) | 2023.05.15 |
[Spring]Request Parameter/Validation (0) | 2023.05.11 |
[Spring]Thymeleaf 문법, Layout (0) | 2023.05.10 |
[Spring]JDBC/MVC Model (0) | 2023.05.09 |
댓글