하기 코드 복사 후 dependencies 코드 안에 넣기
우측 상단에 생긴 코끼리 reflesh아이콘을 눌러줘야 반영됨

#MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#DB Source URL
spring.datasource.url=jdbc:mysql://localhost:3306/aidev?useSSL=false&userUnicode=true&serverTimezone=Asia/seoul
#DB username
spring.datasource.username=root
#DB password
spring.datasource.password=1234
자바의 ORM 기술 표준
객체를 DB에 저장하고 관리할 때 개발자가 직접 SQL을 작성하지 않아도 됨
JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고 객체를 자동으로 Mapping
스프링 부트는 ORM 프레임워크(Hibernate)가 탑제되어 있음
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa/2.7.6
build.gradle의 dependencies 에 붙여넣기
JPA 쿼리문 확인하기
application.properties 파일
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/aidev?useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
lombok
테이블을 구조화한 클래스(Entity, DTO, VO)에서 getter/setter 메소드와 toString(), equals(), hashCode() 등의 메소드를 어노테이션으로 사용할 수 있도록 해주는 라이브러리
@Data: 자동으로 getter/setter를 지원
@AllArgsConstructor: 모든 매개변수를 지원하는 생성자를 지원
@NoArgsConstructor: 매개변수를 갖지 않는 생성자를 지원
@Entity: DB 테이블과 연결
@Builder: 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현의 결과를 만들 수 있도록 패턴을 사용(체이닝→함수형 프로그래밍)
https://mvnrepository.com/artifact/org.projectlombok/lombok
build.gradle의 dependencies 에 붙여넣기
🤩 builder의 매개변수의 괄호안에 값을 넣지 않을 경우 getter로 사용됨
setter의 경우 .build()로 닫아줘야함
AdminUser adminUser = AdminUser.builder().userid() //getter
AdminUser adminUser = AdminUser.builder().userid("apple").userpw("1111").name("김사과").build(); //setter
JPA Hibernate Entity 생성하기
admin_user(DB) == AdminUser(Java)
스네이크표기 카멜표기
@Entity: DB의 테이블을 뜻하는 클래스 @Id: primary key를 뜻함 @GeneratedValue: primary key의 키 생성 전략(Strategy)을 설정할 때 사용 @Column: DB 필드명을 명시(DB필드명과 클래스 필드명이 동일한 경우 생략) @Transient: DB에는 존재하지 않은 필드에 명시JPA Repository
Spring Data JPA의 구현체인 Hibernate를 이용하기 위한 API
😎 Hibernate란
하기 sql 구문을 자동 실행하여 sql 문 없이 사용 가능
Hibernate: insert into admin_user (last_login_at, name, reg_date, status, userid, userpw) values (?, ?, ?, ?, ?, ?)
JpaRepository의 제네릭 타입으로는 <Eintity, PK타입>을 지정
자동으로 스프링의 빈(Bean)으로 등록됨
꼭 존재해야 하는 것은 아님
public interface 인터페이스명 extends JpaRepository<테이블명, PK타입>{
SQL 쿼리를 대신할 메소드 정의
}
save(): sql문 저장
delete(): 지정된 테이블필드 삭제
Test(Junit)
@Test
DI(Dependency Injection) : 의존성 종속 ☆★
클래스 간의 의존 관계를 스프링 컨테이너가 자동으로 연결해주는 것
예) 클래스A가 클래스 B, C와 상호작용을 한다면 객체 A는 객체 B,C와 의존관계다
DI가 필요한 이유: 객체 간의 의존성
DI유형(의존 관계에 있는 Bean을 주입하는 방법)
1. Setter Injection
- setter/getter 메소드의 setter 메소드를 통해 의존 관계에 있는 객체를 주입
2. Constructor Injection
- 생성자를 통해 의존 관계에 있는 객체를 주입
3. Method Injection
- 메소드를 통해 의존 관계에 있는 객체를 주입
@Autowired
스프링 DI에서 사용하는 어노테이션
스프링에서 빈 인스턴스가 생성된 이후에 @Autowired를 설정한 메소드가 자동으로 호출되고 인스턴스가 자동으로 주입
Integer나 Double 클래스와 같이 ‘T’ 타입의 객체를 포장하는 Wrapper Class
(Optional의 인스턴스는 모든 타입의 참조 변수를 저장 가능)
NullPointerException 예외를 예방하기 위한 좋은 방법
시작(객체생성) → 중간(Optional 객체 반환) → 끝(체이닝 종료) 3단계로 구현
함수형 프로그래밍, 메소드 체이닝을 가능하게 함
객체생성
of()
ofNullable()
empty()
- 비어있는 optional 객체를 반환
중간
filter()
😶 입력값은 functional interface로 매개변수를 특정 연산으로 체크하여 boolean값을 반환함(특정 연산이란 람다식으로 표현)
map()
- optional 객체에 저장된 값을 map() 내의 함수를 통해 반환하고, 변환값을 담은 optional 객체에 반환
끝
ifPresent()
isPresent()
get()
orElse()
👻 orElse는 optional 객체가 비어있지 않던, 비어있던 무조건 실행
orElseGet()
👻 orElseGet은 비어있을 때만 실행
orElseThrow()