| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 배열
- 삼항 연산
- Integer.MAX_VALUE
- 오버로딩
- 이중 배열
- 중첩for문
- docker
- 다형성
- 메소드
- scanner
- for문
- 상수
- Break
- javascript
- 인터페이스
- 문자열
- super()
- rs.next()
- arraylist
- Else If
- interface
- 자바
- 이클립스
- 상속
- Integer.MIN_VALUE
- 삼항 연산식
- If
- 2차원 배열
- jsp
- extends
- Today
- Total
개발로드
★KDT 2024-04-02☆SpringBoot-Maven-Restful,JPA,@RestController 본문
RestController
@RestController에 경로를 리턴
@RestController
public class RestControllerTest {
@GetMapping("/test1")
public String HelloRest(){
return "index";
}//end of HelloRest

index.html로 이동하지 않고. 브라우저에 return에 쓴 내용이 그대로 출력된다.
DTO 생성
@Getter
@Setter
@ToString
public class TestDto {
private String id;
private String name;
private Integer age;
}//end of class
@RestController에서 객체를 반환하는 메소드 작성
@GetMapping(value = "/test3")
public TestDto testRestDto(){
TestDto dto = new TestDto();
dto.setId("wnd1000");
dto.setName("중원");
dto.setAge(28);
return dto;
}//end of testRestDto

dto 객체에 값을 넣어주고 return 값으로 dto를 주었더니. 브라우저에 객체가 출력된다.
브라우저에 객체가 JSON형식으로 출력
Spring에서 @RestController를 사용하면 해당 컨트롤러가 JSON 또는 XML과 같은 형식으로 HTTP 응답을 생성할 수 있습니다.
여기서는 TestDto 객체가 JSON 형식으로 변환되어 HTTP 응답으로 전송됩니다. 이는 Spring의 HTTP 메시지 컨버터가 자동으로 TestDto 객체를 JSON으로 변환하여 클라이언트로 반환하기 때문입니다.
@RestController 어노테이션은 @Controller와 @ResponseBody 어노테이션을 조합한 것입니다. @ResponseBody 어노테이션은 메서드가 HTTP 응답의 본문에 직접 데이터를 작성하도록 지시합니다. 그래서 메서드에서 객체를 반환하면 이 객체가 JSON 또는 XML과 같은 형식으로 변환되어 클라이언트에게 반환됩니다.
따라서 testRestDto() 메서드에서 TestDto 객체를 반환하면 Spring은 이를 JSON 형식으로 변환하여 브라우저에게 전송하게 됩니다. 이를 통해 클라이언트는 JSON 형식의 데이터를 받아서 브라우저에서 출력할 수 있습니다.
JPA(Java Persistence API) : 자바 ORM 기술에 대한 API 표준
ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑해주는 것
JPA
**JPA(Java Persistence API)**는 자바에서 관계형 데이터베이스를 사용할 때 데이터를 영구적으로 저장하고 관리하기 위한 API입니다.
JPA는 객체 지향 언어인 자바와 관계형 데이터베이스 간의 간극을 줄이고, 데이터베이스 관련 작업을 쉽게 처리할 수 있도록 도와줍니다.
JPA는 객체를 데이터베이스에 저장하고 검색하는 등의 CRUD(Create, Read, Update, Delete) 작업을 수행할 때 사용됩니다.
ORM
**ORM(Object-Relational Mapping)**은 객체와 관계형 데이터베이스 간의 매핑을 자동화하는 기술입니다.
ORM은 객체 지향 프로그래밍에서 사용되는 객체와 관계형 데이터베이스의 테이블 간의 매핑을 단순화하고 관리하기 위해 도입되었습니다.
ORM은 개발자가 객체를 사용하여 데이터를 다루고, ORM 프레임워크가 이를 데이터베이스에 자동으로 매핑하여 SQL을 생성하고 실행합니다.
JPA와 ORM의 관계
JPA는 ORM의 구현체 중 하나입니다. JPA는 자바에서 관계형 데이터베이스와 상호 작용하기 위한 표준 인터페이스를 제공합니다.
ORM은 개념적인 측면에서 객체-관계 매핑 기술을 나타내며, JPA는 이러한 ORM 기술을 자바에서 사용하기 위한 표준화된 인터페이스를 제공합니다.
JPA와 ORM의 장점
코드의 간결성과 생산성 향상: 객체 지향적인 코드로 데이터베이스를 다룰 수 있기 때문에 개발자가 비즈니스 로직에 집중할 수 있습니다.
유지보수성 증가: 객체를 이용한 데이터베이스 조작은 데이터베이스 스키마의 변경에 유연하게 대응할 수 있습니다.
성능 최적화: JPA 구현체는 자동으로 쿼리를 최적화하고 캐싱을 관리하여 애플리케이션의 성능을 향상시킵니다.
JPA 동작 방식
- 엔티티(Entity) : 데이터베이스의 테이블에 대응하는 클래스
- @Entity : JPA가 관리하는 엔티티
- 엔티티 매니저 팩토리(Entity Manager Factory) : 엔티티 매니저 인스턴스(객체)를 관리하는 주체
- 애플리케이션 실행 시 한 개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성
- 엔티티 매니저(Entity Manager) : 영속성 컨텍스트(Persistence Context)에 접근하여 엔티티에 대한 데이터베이스 작업을 제공
- 내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근
- find() : 영속성 컨텍스트에서 엔티티를 검색하고, 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장
- persist() : 엔티티를 영속성 컨텍스트에 저장
- remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제
- flush() : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영
영속성(Persistence Context)
영속성(Persistence)은 데이터의 지속성을 의미합니다. 관계형 데이터베이스에서 데이터를 영구적으로 저장하고 유지하는 것을 말합니다. 즉, 데이터베이스에 저장된 데이터는 프로그램이 종료되어도 지속적으로 보존되며, 다음에 프로그램이 실행될 때에도 그대로 사용할 수 있습니다.
JPA(Java Persistence API)에서의 영속성은 객체의 지속성을 의미합니다. JPA는 객체를 관계형 데이터베이스에 매핑하고, 이러한 객체들이 영구적으로 유지되도록 도와줍니다. 따라서 JPA를 사용하면 객체의 상태를 데이터베이스에 저장하고 검색할 수 있으며, 프로그램이 종료되어도 데이터는 영구적으로 보존됩니다.
영속성은 주로 객체지향 프로그래밍에서 사용되는 용어이며, 객체의 상태를 지속적으로 유지하고 관리하는 것을 의미합니다. 이는 객체의 상태를 데이터베이스에 저장하고 데이터베이스로부터 다시 불러오는 과정을 포함합니다. 이러한 영속성은 객체의 생명주기를 관리하고 데이터의 지속성을 보장하는 데 중요한 역할을 합니다.
영속성 컨텍스트
영속성 컨텍스트는 JPA가 엔티티를 관리하는 환경을 말합니다. 영속성 컨텍스트는 엔티티의 생명주기를 관리하고, 엔티티의 상태를 추적합니다. 이는 메모리 내의 일종의 작은 데이터베이스라고 생각할 수 있습니다. 엔티티 매니저가 데이터베이스와 상호 작용할 때 영속성 컨텍스트를 사용하여 데이터베이스 작업을 수행합니다.
영속성 컨텍스트의 주요 특징
- 1차 캐시(First Level Cache): 영속성 컨텍스트에는 엔티티가 영속 상태로 저장되는 캐시가 있습니다. 이 캐시를 통해 동일한 엔티티에 대한 반복적인 데이터베이스 액세스를 피할 수 있습니다.
- 더티 체킹(Dirty Checking): 영속성 컨텍스트는 엔티티의 변경 사항을 추적하고, 트랜잭션이 커밋될 때 변경된 엔티티만 데이터베이스에 반영합니다.
- 트랜잭션을 지원하는 쓰기 지연(Transaction Write-behind): 영속성 컨텍스트는 변경된 엔티티를 데이터베이스에 바로 반영하는 것이 아니라, 트랜잭션이 커밋될 때 한꺼번에 데이터베이스에 반영합니다. 이를 통해 성능을 향상시킬 수 있습니다.
이처럼 영속성 컨텍스트는 JPA에서 중요한 개념 중 하나로, 엔티티의 상태를 추적하고 엔티티 매니저를 통해 데이터베이스와 효율적으로 상호 작용할 수 있도록 도와줍니다.
Entity 매핑 어노테이션
@Entity : 클래스를 엔티티로 선언 => 테이블에 대응
@Table : Entity와 매핑할 테이블을 지정
@Id : 테이블의 기본키에 사용할 속성 지정
@generateValue : 키 값을 생성하는 전략 명시
@Column : 필드와 컬럼 매칭
@Lob :
@CreationTimestamp
@UpdateTimestamp
@Enumerated
@Transient
@Temporal
@CreateDate
@LastModifiedDate
테이블 생성 및 dto 작성
package com.cshop.entity;
import com.cshop.constant.ItemSellStatus;
import java.time.LocalDateTime;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
//책은 3ver로 빌려서 해보기
@Getter
@Setter
@ToString
//Entity : 클래스를 데이터베이스 테이블에 대응되는 엔티티로 선언한다. JPA가 관리한다.
@Entity
//Entity와 매핑할 table로 지정해주고, 이 테이블의 이름은 itme이다.
//item table과 매핑한다.
@Table(name = "item")
public class Item {
@Id//기본키 설정, entity로 선언한 클래스는 반드시 기본키가 있어야 한다.
@Column(name = "item_id") //매핑되는 컬럼명, Item 클래스의 id와 item table의 item_id가 매핑된다.
@GeneratedValue(strategy = GenerationType.AUTO)//기본키 설정 전략(생성 방법)
/*
* GenerationType
* AUTO : JPA 구현체(Hibernate)가 자동으로 생성 전략 결정
* IDENTITY : 데이터베이스 니가 알아서 설정하셈
* SEQUENCE : 데이터베이스 sequence object를 이용한 기본키 생성
* TABLE : 키 생성용 테이블을 사용한다.
*/
private Long id; //상품코드
//itemName은 null값 비허용이고, 데이터의 사용 가능한 길이는 50이고 데이터베이스에서의 이름은 item_name이다.
@Column(nullable = false, length = 50, name = "item_name") //null값 비허용, 반드시 입력 받기
// char(50), varchar(50) - length, 즉 길이로 표현하고 length의 특정 길이를 선언하지 않는다면 255자까지 가능하다.
/* @Column(nullable = true) null값 허용, 값 입력은 선택! */
private String itemName; //상품명
@Column(nullable = false, name = "price") //입력 필수, 이름을 똑같이 줄거면 생략해도 ㅇㅋ
private int price; //가격
@Column(nullable = false) //입력 필수
private int stockNumber; //재고수량
@Lob //text, img, videos,... 용량이 큰 데이터를 저장한다.
// DB의 BLOB, CLOB에 대응된다.
@Column(nullable = false)
private String itemDetail; //상품상세설명
@Enumerated(EnumType.STRING) //enum 타입을 썼다는 것을 알려주기 위해서 사용했고, enumtype이 String으로 사용되었음.
@Column
private ItemSellStatus itemSellstatus; //상품판매상태
private LocalDateTime regTime; //등록시간
private LocalDateTime updateTime; //수정시간
}
생성된 table

item_seq 테이블
@GeneratedValue(strategy = GenerationType.AUTO)//기본키 설정 전략(생성 방법)
@GeneratedValue(strategy = GenerationType.AUTO)는 JPA에서 엔티티의 기본 키를 자동으로 생성하는 방법을 설정하는 어노테이션입니다. strategy 속성을 통해 어떤 방식으로 기본 키를 생성할지를 지정할 수 있습니다.
여기서 GenerationType.AUTO는 JPA 구현체(예: Hibernate)에게 기본 키 생성 전략을 자동으로 선택하도록 합니다. 구현체는 데이터베이스 종류에 따라 가장 적절한 전략을 선택합니다.
LocalDateTime => datetime
LocalDateTime 필드가 데이터베이스의 DATETIME 타입으로 자동으로 매핑되는 것은 JPA와 Hibernate의 기본 동작에 기인합니다.
기본적으로 JPA는 LocalDateTime과 같은 자바 8 이후의 날짜 및 시간 관련 타입을 지원하고, 이를 데이터베이스의 적절한 날짜 및 시간 타입에 매핑합니다.
따라서 regTime과 updateTime 필드는 JPA가 자동으로 데이터베이스에 맞게 DATETIME 또는 유사한 타입으로 매핑됩니다.
그러나 명시적으로 날짜 및 시간 타입을 설정하고 싶다면 @Temporal 어노테이션을 사용하여 매핑할 수도 있습니다.
@Column
@Temporal(TemporalType.TIMESTAMP) // DATETIME과 매핑
private LocalDateTime regTime; // 등록시간
@Column
@Temporal(TemporalType.TIMESTAMP) // DATETIME과 매핑
private LocalDateTime updateTime; // 수정시간
하지만 기본적으로는 이러한 명시적인 설정 없이도 JPA가 LocalDateTime을 적절하게 매핑하여 데이터베이스에 저장합니다.
여유가 되신다면 제 GitHub에 오셔서 좋은 코드들을 구경해주세요!

https://github.com/gimpo5975?tab=repositories
gimpo5975 - Overview
gimpo5975 has 6 repositories available. Follow their code on GitHub.
github.com
'JAVA' 카테고리의 다른 글
| ★KDT 2024-04-03☆SpringBoot-Maven- SpringSecurity,Test, 계층분리 (0) | 2024.04.03 |
|---|---|
| ☆KDT 2024-04-02★SpringBoot-Maven-JpaRepository (0) | 2024.04.02 |
| ☆KDT 2024-04-01★SpringBoot-Maven-회원CRUD (0) | 2024.04.01 |
| ★KDT 2024-04-01☆SpringBoot-Maven- (0) | 2024.04.01 |
| ☆KDT 2024-04-01★SpringBoot-Maven-MyBatis (0) | 2024.04.01 |