Spring Framework

JPA) JPA 심화

na_o 2021. 7. 14. 21:49
728x90

- CURD

정보관리의 기본 기능

생성(Create), 조회(Read), 변경(Update), 삭제(Delete)

 

- Create, Read

/*Week02Application.java*/
package com.sparta.week02;

import com.sparta.week02.domain.Course;
import com.sparta.week02.domain.CourseRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.util.List;


@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {

    public static void main(String[] args) {
        SpringApplication.run(Week02Application.class, args);
    }

    //프로젝트에서 실제로 쓰이진 않음. 단지 JPA 사용을 보여주기 위해 튜터가 만들어본 코드임
    @Bean
    //repository: 쿼리를 날리는 녀석
    public CommandLineRunner demo(CourseRepository repository) {
        return (args) -> {
            // 데이터 저장하기
            repository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));

            // 데이터 전부 조회하기
            List<Course> courseList = repository.findAll();
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getTutor());
            }

            // 데이터 하나 조회하기
            Course course = repository.findById(1L).orElseThrow(
                    () -> new NullPointerException("아이디가 존재하지 않습니다.")
            );
        };
    }
}

 

- 스프링의 구조

1. Controller: 가장 바깥 부분. 요청/응답을 처리함

2. Service: 중간 부분. 실제 중요한 작동이 많이 일어나는 부분. update 적는 부분

3. Repository: 가장 안쪽 부분. DB와 맞닿아 있음

 

- Service

update, delete로 넘어가기 전에 다루어야하는 개념

/*Course.java*/
...
    public void update(Course course) {
        this.title = course.title;
        this.tutor = course.tutor;
    }
 ...
/*CourseService.java*/
package com.sparta.week02.service;

import com.sparta.week02.domain.Course;
import com.sparta.week02.domain.CourseRepository;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {

    // final: 서비스에게 꼭 필요한 녀석임을 명시
    private final CourseRepository courseRepository;

    // 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
    // 스프링에게 알려줌
    //생성자를 적어주면 스프링이 알아서 CourseRepository 클래스를 매개변수에 가져옴
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    //클래스의 멤버변수 값을 바꿔주면 DB에 자동으로 업데이트되게 해주는 어노테이션
    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    //매개변수 id: 어떤 데이터를 업데이트할 지 가리켜줘야함
    //course: 업데이트할 정보
    public Long update(Long id, Course course) {
        //DB에서 조회한 결과가 Course 클래스에 담겨있음 그걸 가리키는게 course1
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        //DB에서 조회한 결과가 담겨있는 Course클래스의 변수 course1을 update를 진행
        //뭘 수정할 지 정보 갖고있는건 course
        course1.update(course); //Course클래스의 멤버변수 값을 변경하게 해줌. @Transactional이 DB값 수정해줌
        return course1.getId(); //메소드 update의 결과값은 아이디값
    }
}
/*Week02Application.java*/
package com.sparta.week02;

import com.sparta.week02.domain.Course;
import com.sparta.week02.domain.CourseRepository;
import com.sparta.week02.service.CourseService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.util.List;


@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {

    public static void main(String[] args) {
        SpringApplication.run(Week02Application.class, args);
    }

    @Bean
    public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
        return (args) -> {
            //테이블 생성 후 데이터 insert
            courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
            
            System.out.println("데이터 인쇄");
            //테이블 데이터 전체 조회
            List<Course> courseList = courseRepository.findAll();
            //테이블 조회해온 모든 데이터 출력
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getTutor());
            }

            //수정할 데이터 Course 클래스에 세팅해줌
            Course new_course = new Course("웹개발의 봄, Spring", "임민영");
            //데이터 수정
            courseService.update(1L, new_course);
            //테이블 데이터 전체 조회
            courseList = courseRepository.findAll();
            //전체조회한 데이터 모두 출력
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getTutor());
            }
            
            
            //테이블 데이터 모두 삭제
            courseRepository.deleteAll();
            //특정 행만 삭제
            //courseRepository.deleteById(1L);
        };
    }
}

update 및 delete가 된 것을 확인할 수 있음

'Spring Framework' 카테고리의 다른 글

API-GET  (0) 2021.07.18
Lombok, DTO  (0) 2021.07.18
JPA) 생성일자, 수정일자  (0) 2021.07.11
JPA) JPA 사용해보기  (0) 2021.07.11
JPA) JPA 시작하기  (0) 2021.07.09