Java, IntelliJ/Spring

Java JPA /Timestamped/service/update/delete 사용법

고로케 2021. 6. 26.
반응형

Java JPA 사용법 기초

1. Domain, Repository 만들기

  •  src > main > java > com.sparta.week02에 domain 이라는 패키지를 만듭니다.
  • Course.java (Class) / CourseRepository.java (interface) 파일을 만듭니다.

 

2.  다음 코드를 Course.jave 클래스에 붙여 넣는다.

import lombok.NoArgsConstructor;

import javax.persistence.*;

@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course {

    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String tutor;

    public String getTitle() {
        return this.title;
    }

    public String getTutor() {
        return this.tutor;
    }

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

 

3. 다음 코드를 CourseRepository.java (interface) 에 붙여넣는다

 

public interface CourseRepository extends JpaRepository<Course, Long> {
}

 

4. SQL이 보이도록 application.properties 세팅

.properties 파일에 다음과 같이 삽입

spring.jpa.show-sql=true

 

5. 임시 JPA 실행코드 삽입

// Week02Application.java 의 main 함수 아래에 붙여주세요.
@Bean
public CommandLineRunner demo(CourseRepository repository) {
    return (args) -> {

    };
}

 

6. 아래와 같이 ->{ } 괄호 안에 예제 작성

.save()  :  테이블에 저장

List<Course> courseList = repository.findAll() : 모든 값 찾아서 courseList에 리스트형태로 저장하기

 

* getter 매서드로 값 가져오기

Course c = courseList.get(i)

c.getTutor()

 

return (args) -> {

    Course course1 = new Course("웹 개발의 봄 Spring", "고로케");
    repository.save(course1);

    List<Course> courseList = repository.findAll();
    for (int i = 0; i < courseList.size(); i++) {
        Course c = courseList.get(i);
        System.out.println(c.getTutor());
       }

 

7. localhost: 8080/h2-console/ 이동해서 테이블 확인

 

생성일자, 수정일자 만들기 -Timestamped

상속(extends) 개념 이해하기 (더보기 클릭)

더보기

상속이란?

  • "클래스의 상속"이라는 개념인데요. "이미 만들어둔거 가져다 쓰자!" 라고 선언하는 것입니다.
class Person {
	private String name;
	private String getName() {
		return this.name;
	}
}

class Tutor extends Person {
	private String address;
	// Person 클래스를 상속했기 때문에,
	// name 멤버변수와 getName() 메소드를 가지고 있습니다.
}

 

-  Timestamped로 상속 연습, 생성/수정일자 만들기

 

1) domain 패키지 안에 Timestamped 클래스 파일 생성

다음 코드를 붙여넣기.

@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public class Timestamped {

    @CreatedDate // 생성일자임을 나타냅니다.
    private LocalDateTime createdAt;

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
    private LocalDateTime modifiedAt;
}

2) domain의 Course 클래스 옆에 다음과 같이 extends 추가

public class Course extends Timestamped{

 

3) Week02Application 클래스에 다음과 같이 내용 추가

@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {

 

4) http://localhost:8080/h2-console 접속해서 확인해보기

  1. Week02Application 재시작!
  2. course 조회SELECT * FROM course;

 

데이터 조회하기

application에 아래 코드 붙여넣기

// 데이터 저장하기
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 IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);

*  // 데이터 하나 조회하기 코드 설명

.findById(1L) : id값으로 찾아라/ id값은 long 이라서 숫자뒤에 L 을 붙여줌. 

.orElseThrow( : 만약에 그 id가 없으면 Throw ( ) 괄호 안과 같이 작동해라.

() -> new NullPointerException("아이디가 존재하지 않습니다")) 혹은

() -> new IllegalArgumentException("아이디가 존재하지 않습니다")) 

 

service의 개념

update, delete 로 넘어가기 전에, 다루어야 하는 개념이 바로 Service 입니다.

  • 스프링의 구조는 3가지 영역으로 나눌 수 있습니다.
    1. Controller : 가장 바깥 부분, 요청/응답을 처리함.
    2. → 후반부에 배울 녀석
    3. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
    4. → 지금 배울 녀석
    5. Repo : 가장 안쪽 부분, DB와 맞닿아 있음.
    6. → 여태 배운 녀석 (Repository, Entity)
  • Update 는 Service 부분에 작성합니다. 
    :  밖에서 업데이트 요청이 들어오면 중간에 서비스에서 작동함

service 만들고 update 하는 법

1. domain의 Course 클래스에 update 메소드 추가

public void update(Course course) {
    this.title = course.title;
    this.tutor = course.tutor;
}

 

2. src > main > java > com.sparta.week02 > service 패키지 생성
3. CourseService.java 만들기

 

4. CourseService.java 클래스에 아래 코드 삽입

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

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

		// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
		// 스프링에게 알려줌
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    public Long update(Long id, Course course) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course);
        return course1.getId();
    }
}

5. 코드 설명

private final : 이 클래스에 꼭 필요한 것이고 값을 고정함 (변경 x)

 

private final CourseRepository : CourseRepository

public CourseService(CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}

- Service만들 때 CourseRepository로 연결하고 Repository에 넣어주도록 스프링에 알려줌

 

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    public Long update(Long id, Course course) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course);
        return course1.getId();
    }
}

- 업데이트 할 값 course 를 id 를 찾아서 (없다면 에러문구 출력)

- course1.update(course) -> 1번에서 추가한 update 메소드로 title과 tutor 값이 변경된다.

- return으로 그 Id값을 돌려줘라

 

 

예제로 어떻게 돌아가는지 확인하기

    // Week02Application.java 의 main 함수 아래에 붙여주세요.
    @Bean
    public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
        return (args) -> {
            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 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());
            }
        };
 

-결과 출력

delete 기능

다음중 필요한 삭제 기능을 아래와 같이 삽입한다.

courseRepository.deleteAll();  # 데이터 다 지우기
courseRepository.deleteById(); # 특정Id 데이터 지우기
@Bean
public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
    return (args) -> {
			...
			...
            courseRepository.deleteAll();
            courseRepository.deleteById();
    };
}

 

 

 

 

 

 

반응형

댓글