Java JPA /Timestamped/service/update/delete 사용법
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 접속해서 확인해보기
- Week02Application 재시작!
- 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가지 영역으로 나눌 수 있습니다.
- Controller : 가장 바깥 부분, 요청/응답을 처리함.
- → 후반부에 배울 녀석
- Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
- → 지금 배울 녀석
- Repo : 가장 안쪽 부분, DB와 맞닿아 있음.
- → 여태 배운 녀석 (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();
};
}
'Java, IntelliJ > Spring' 카테고리의 다른 글
Java Spring_API-GET/POST/PUT/DELETE (0) | 2021.06.27 |
---|---|
Java/intelliJ Lombok, DTO 사용법 (2) | 2021.06.26 |
Java Spring H2 Console 사용법 (0) | 2021.06.26 |
Web server failed to start. Port 8080 was already in use 에러 (0) | 2021.06.25 |
Java Spring 새 프로젝트 만들기 (0) | 2021.06.25 |
댓글