본문 바로가기
웹/Spring, Django

[Spring]Application-CRUD

by stubborngastropod 2023. 5. 12.
728x90

퀴즈 애플리케이션을 만들 때 레이어를 3개로 나누어 개발.

  • 애플리케이션 레이어: 클라의 요청을 제어하고 도메인 레이어를 사용해 애플리케이션 제어
    • Controller: 요청을 처리에 매핑, 결과를 뷰에 넘김. 주요 처리는 도메인 레이어의 서비스를 호출
    • Form: 화면의 폼을 표현, 화면의 입력값을 컨트롤러에 넘기고 컨트롤러에서 화면을 출력할 때도 사용.
    • View: 화면 표시
  • 도메인 레이어: 도메인 객체에 대해 애플리케이션 서비스 처리 실행
    • Domain Object: 서비스 처리에 필요한 자원(Entity 등)
    • Service: 애플리케이션의 서비스 처리
      • Repository: 인터페이스. 데이터베이스의 데이터 조작 내용 정의
  • 인프라스트럭쳐 레이어: 도메인 객체에 대해 CRUD 조작을 통해 데이터의 영속화 담당
    • RepositoryImpl: 도메인 레이어에서 정의한 repository의 구현 클래스
    • ORM: 객체와 RDB 간의 관계 매핑

pdAdmin4를 통해 퀴즈 데이터베이스 생성

스키마 생성시에 데이터타입을 잘못 지정해줘서 애먹었다! 주의해서 설정하기

퀴즈 DB

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

댓글