스프링 부트
context-path ='/'
// 포트번호 변경
springboot dev tools - 서버 자동 재시작, 라이브 리로드
(템플릿쪽 변경 사항 -> 브라우저 새로고침)
프로필
spring.profiles.active
-기본값 default
설정 값에 따라서 application-환경변수명.properties로 동작
실행 시 환경 변수 설정 방법
-D환경변수명=값
--환경변수명=값
dev는 개인설정
application-dev.*
깃이그노어에 추가
jar
gradle build / mvn package
-> 컴파일 -> 테스트 -> jar
gradle jar
gradle bootJar : 컴파일 -> jar
gradle bootRun : 스프링 부트 시작
java -jar jar 파일
예) 프로필 prod
java -jar -Dspring.profiles.active=prod jar 파일명
java -jar jar 파일명 --spring.profiles.active=prod
컨트롤 + C
YAML - Yet Another Markup Language
- YAML Ain't Markup Language
이걸
이렇게
설정 파일(yml, properties)에 환경 변수로 치환되는 부분을 직접 설정
${환경 변수명}
-민감한 설정은 직접 코드로 작성 X, 환경 변수로 실행 중에 설정
1) fixedDelay
2) fixedRate
3) initialDelay
4) cron
5) @EnableScheduling
0) ORM : 객체 <- 번역(ORM) -> DB
//application.yml
server:
port: 3000
spring:
# 데이터베이스 설정
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:XE
username: ${db.username}
password: ${db.password}
# jPA 설정
jpa:
properties:
hibernate:
show_sql: true # 실행하는 SQL을 콘솔에 출력
format_sql: true # 실행되는 SQL의 들여쓰기 및 줄 개행
use_sql_comments: true
# dialect: org.hibernate.dialect.OracleDialect
hibernate:
ddlAuto: create
# 로거 설정
logging:
level:
org:
hibernate:
type: trace
1) JPA란?
JPA (Java Persistence API) : ORM 표준 (Object Relational Mapping)
자바 영속성 API
Hibernate Entity Manager
동일한 코드 -> 드라이버 변경 -> 플랫폼에 맞는 쿼리 실행
EntityManagerFactory
-> EntityManager : 엔티티 영속성 관리
2) JPA 동작 방식
- 엔티티 : 엔티티 클래스의 정의 : 테이블의 정의
: 각각의 엔티티는 데이터 하나 하나
- 엔티티 매니저 팩토리
- 엔티티 매니저
1) find() : 조회, 기본키로 조회, 이미 영속성에 엔티티가 있으면 DB에서 조회 X - 1차 캐시, 성능상 이점
2) persist() : 영속성 컨텍스트에 엔티티를 영속 : 상태 감지 시작
3) remove() : 영속성 상태 -> 제거 상태 : DELETE
4) flush() : DB 반영
참고)
find(..) 조회 메서드 호출시 flush()가 먼저 진행 되고 -> 조회
5) detach() : 영속성 분리 : 상태감지 X
6) clear() : 영속성 전체 제거
6) merge() : 분리된 영속성 -> 영속 상태 : 상태 감지 O
- EntityManagerFactory
- EntityManager : 엔티티의 영속성 관리
void test1() {
// EntityManager em = emf.createEntityManager();
Member member = new Member();
member.setSeq(1L);
member.setEmail("user01@test.org");
member.setPassword("12345678");
member.setUserName("사용자01");
member.setCreatedAt(LocalDateTime.now());
em.persist(member); // 영속 상태 - 변화 감지 메모리에 있다, 변화 감지..
em.flush(); // INSERT 쿼리
em.detach(member); // 영속 상태 분리 - 변화 감지 X
member.setUserName("(수정)사용자01"); // 변경
member.setModifiedAt(LocalDateTime.now());
em.flush(); // UPDATE 쿼리
em.merge(member); // 분리된 영속 상태 -> 영속 상태 (변화 감지 상태)
em.flush();
// em.remove(member);
}
3) 영속성 컨텍스트 사용 시 이점
4) 영속성 컨텍스트
5) 엔티티의 생명주기
JPQL -> Java Persistence Query Language
-> 모든 DB 플랫폼에 호환
-> 조회 결과가 영속 상태(변화 감지)
7) 설정하기
- DDL_AUTO
none : 아무런 변경 X
create : 애플리케이션 시작시에 기존 테이블 DROP, 새로 생성
create-drop : 애플리케이션 시작시에 기존 테이블 DROP, 새로 생성, 종료시에도 DROP
update : 기존 테이블 DROP X, 변경 사항만 반영(제거 X)
validate : 기존 테이블 DROP X, 변경 사항 체크(변경 사항이 있으면 예외 발생)
개발시 : create, update
배포 서버 : none, validate
1) 엔티티 매핑 관련 애노테이션
실제 테이블명 CH_MEMBER인데 클래스는 Member로 정의하고 싶은 경우?
public class Member extends BaseEntity {
@Id @GeneratedValue // 자동 증감
private Long seq;
@Column(length=60 ,nullable = false, unique = true)
private String email;
@Column(length=65 ,nullable = false)
private String password;
// @Column(name="name") // 실제 DB에 저장되어 있는 필드명
@Column(length=40, nullable = false)
private String userName;
// @Lob
@Transient
private String introduction;
@Column(length=10)
@Enumerated(EnumType.STRING)
private Authority authority;
}
- java.time API 사용시 필요 X
LocalDate, LocalTime, LocalDateTime
2) 공통 속성화
@MappedSuperclass : 공통 속성화를 위한 상위 클래스
3) @IdClass
: 기본키를 여러 컬럼을 조합해서 생성
: 게시글 조회수 - UV
브라우저 정보(User-Agent) + IP + 회원번호(0) : UID + 게시글 번호(ID)
4) @GeneratedValue ; 자동 증감 번호
5) @CreatedDate, @LastModifiedDate -> 엔티티의 상태 변화에 따라서 값이 업데이트