1. 헷갈릴만한 개념
DDL(Data Definition Language)
데이터 정의어란? 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어이다.
- create : 데이터베이스, 테이블등을 생성
- alter : 테이블을 수정
- drop : 데이터베이스, 테이블을 삭제
- truncate : 테이블을 초기화
※SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의하거나 변경 또는 삭제할 때 사용하는 언어
※데이터 베이스 관리자나 데이터베이스 설계자가 사용
DML(Data Manipulation Language)
데이터 조작어란? 정의된 데이터베이스에 입력된 레코드를 조회하거나 수정하거나 삭제하는 등의 역할을 하는 언어.
- select : 데이터 조회
- insert : 데이터 삽입
- update : 데이터 수정
- delete : 데이터 삭제
※데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터를 실질적으로 처리하는데 사용하는 언어
※데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공
DCL(Data Control Language)
데이터베이스에 접근하거나 객체에 권한을 주는등의 역할을 하는 언어
- grant : 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 부여
- revoke : 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 박탈, 회수
- commit : 트랜잭션의 작업을 저장
- rollback : 트랜잭션의 작업을 취소, 원래대로 복구
ROLL 객체
※ROLE 종류
CONNECT : DB 접속 권한
RESOURCE : 테이블이라든지 인덱스라든지 생성할 수 있는 권한
CREATE VIEW : 뷰 생성 권한
DBA : 모든 권한(관리자)
2.HikariCp
3. 그래이들의 빌드 의존성
- implementation: 프로젝트의 런타임 구성에서만 의존성이 포함되는 것을 의미합니다. 이는 해당 의존성이 프로덕션 코드에서 사용되지만 컴파일된 코드에 포함되지 않는다는 것을 의미합니다. 대부분의 경우, 이것은 다른 모듈이나 라이브러리에 의존하는 경우에 사용됩니다.
- compileOnly: 컴파일 시에만 필요한 의존성을 나타냅니다. 이는 런타임에는 필요하지 않지만 컴파일 시에는 필요한 경우에 사용됩니다. 컴파일된 코드에는 포함되지 않습니다.
- developmentOnly: 주로 플러그인이나 도구와 같은 개발 시에만 필요한 의존성을 나타냅니다. 이 의존성은 프로덕션 코드나 테스트 코드에는 포함되지 않습니다.
- runtimeOnly: 컴파일 시에는 필요하지 않지만 런타임 시에 필요한 의존성을 나타냅니다. 이는 프로덕션 코드에 포함되지 않지만 실행 중에 필요한 경우에 사용됩니다.
- annotationProcessor: 주로 애노테이션 프로세서 라이브러리를 나타냅니다. 이는 컴파일 시에만 필요한 라이브러리이며, 컴파일된 코드에는 포함되지 않습니다.
- testImplementation: 주로 테스트 코드에서만 사용되는 의존성을 나타냅니다. 이는 테스트 코드를 컴파일하고 실행하는 데 필요한 라이브러리이지만, 프로덕션 코드에는 포함되지 않습니다.
4.ORM
5.entity
데이타베이스테이블에 대응되는 클래스를 entity라 합니다.
6.JPA(JAVA Persistent API)
7.JPA (영속성의 컨텍스트의 특징중 하나인 ‘쓰기지연’) ㅡ 쓰기지연 ★★★
바로적용 아니라, 커밋시점에, DB에 반영합니다.
그래서 뭐가 필요하냐면, 트랜잭션 관리가 중요합니다.
JAP
영속성 컨테스트안에 있는 캐시를 찾아봅니다.
1차캐시에 내가 찾는게 잇다면 바로 불러옵니다.
1차캐시안에 있으면 바로 불러서 그것을 쓸것이고
없다면, DB에서 찾고 넘기는 구조입니다.
8. 엔티티에서,
@GeneratedValue 어노테이션은 주로 JPA (Java Persistence API) 엔티티 클래스에서 사용됩니다. 이 어노테이션은 엔티티 클래스의 기본 키(primary key)를 자동으로 생성하는 방법을 지정합니다.
strategy와 generator는 @GeneratedValue 어노테이션의 속성 중 일부입니다.
- strategy: strategy 속성은 기본 키를 생성하는 전략을 지정합니다. 일반적으로 사용되는 전략은 다음과 같습니다:
- generator: generator 속성은 GenerationType이 SEQUENCE 또는 TABLE인 경우에만 필요합니다. 이 속성은 사용할 시퀀스나 테이블의 이름을 지정합니다.
이러한 설정을 통해 JPA는 엔티티 객체를 데이터베이스에 저장할 때 자동으로 기본 키를 생성하고 관리합니다.
9. properties
- create: SessionFactory 시작시 테이블 삭제하고 다시 생성
- create-drop: create + SessionFactory 종료시 테이블 삭제
- update: SessionFactory 시작시 컬럼 추가/삭제 수행. 데이터 삭제 안함
- validate: SessionFactory 시작시 테이블 컬럼 확인하여 다르면 예외 발생
ㅡㅡㅡ
1
2
3
4
5
6
7
8
ㅡㅡㅡ
●
스프링부트
컨트롤러 서비스 리포지토리
프레젠테이션
계층
JPA기본 ㅡ 자바,객체지향,
#쿼리 DSL이 버전의 영향을 많이 받습니다.
#프로젝트생성
#
#
#application.properties(역할,속성)
먼저 읽는다. 데이터베이스설정,서버포트설정,로딩
이미지를 저장하고
-테스트실행(프로퍼티스)
-일반서비스(프로퍼티스)
#
#
가장좋은방법은 분리해서 처리하는 것
domain - 엔티티
#
순서
-엔티티
-DTO
-레포지토리
-서비스
-컨트롤러
●build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.11'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
tasks.named('bootBuildImage') {
builder = 'paketobuildpacks/builder-jammy-base:latest'
}
tasks.named('test') {
useJUnitPlatform()
}
●2
●Todo(엔티티)
package com.shopapi.domain;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDate;
// JPA : 영속성개념 (저장되는 것을 의미)
@ToString // 확인할때,
@Builder // setter보단 Builder를 사용합니다.
@Getter
@AllArgsConstructor // 모든 필드를 매개변수로 받는 생성자를 자동으로 생성해주는 어노테이션입니다.
@NoArgsConstructor // 매개변수가 없는 기본 생성자를 자동으로 생성해주는 어노테이션입니다.
@Entity
@Table(name="tbl_todo") //테이블이름
public class Todo {
@Id //pk
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long tno;
//숫자로 처리하는 이유는 관리하는 것에 목적
//오라클은 :오토인크리먼트 아닌, 시퀀스로 자동증가 관리
//마리아DB,H2,mysql은 오토인크리먼트로 자동증가관리
//GenerationType.IDENTITY 자동으로 관리할게 - auto_increment개념 ㅡ 데이터베이스가 알아서 처리, 자동으로 생성
//제약을 걸거나, 이름을 바꾸고 싶은 경우,
//제약,이름변경,제약
//@Column(name="content", length = 20) //컬럼을 주고 안주고는 차이가없이, 컬럼이 붙지만, 붙여주면 명확하게 정의할수있습니다.
private String title;
//@Column(nullable = false)
private String writer;
private boolean completed;
private LocalDate dueDate;
public void setTitle(String title){ //changeTitle(){}
this.title = title;
}
public void setWriter(String writer){ //
this.writer = writer;
}
}
ㅡㅡㅡ
●TodoRepository
package com.shopapi.repository;
import com.shopapi.domain.Todo;
import org.springframework.data.jpa.repository.JpaRepository;
//public interface TodoRepository extends JpaRepository<엔티티이름, 키(해당엔티티의pk타입)> {
public interface TodoRepository extends JpaRepository<Todo, Long> {
//JPARepository(페이징기능,CRUD) 에 상속을 받는다.
//CURD 기능이 담겨져있습니다.
//페이징기능
}
ㅡㅡㅡ
●3
#테스트프로그램
●TodoRepositoryTest
package com.shopapi.repository;
import com.shopapi.domain.Todo;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.time.LocalDate;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@Log4j2
public class TodoRepositoryTest {
@Autowired //생성자주입(스프링빈이 알아서 객체생성해줍니다.)
private TodoRepository todoRepository;
//TodoRepository todoRepository = new TodoRepository() //위에 Autowired는 이것을 대신해서 수행해줍니다. 심지어 todoRepository는 인터페이스입니다. 복잡하지만, 알아서 해줍니다.
//스프링빈한테 객체를 만들어주고
//객체를 여기다가 만들어 놓는것
@Test
@DisplayName("TodoRepository 테스트")
public void repositoryTest1(){
log.info("==============================");
log.info(todoRepository);
}
@Test
@DisplayName("데이터 추가 테스트")
public void testInsert(){
for(int i = 1 ; i <=60; i++){
Todo todo = Todo.builder()
.title("제목" + i)
.dueDate(LocalDate.of(2024,04, 26))
.writer("hong" + i)
.build();
todoRepository.save(todo);
}
//builder빌더쓰는 이유 : 명확하게 쓸려고 합니다.
//.build();
//build로 안하고 생성자라고하면, 순서가 바뀔수가 있습니다.
//순서가 바뀌어도, 잘찾아내기가 힘들수있기 때문입니다.
}
@Test
@DisplayName("데이터 조회 테스트")
public void testRead(){
Long tno =20l; //pk 타입이 Long형이기때문에.
//Optional은 주로 값이 존재하지 않을 수 있는 상황에서 NullPointerException을 방지하고자 할 때 사용됩니다.
Optional<Todo> result = todoRepository.findById(tno);
//orElseThrow : 이 메서드는 값이 존재할 경우에는 해당 값을 반환하고,
// 값이 존재하지 않을 경우에는 지정된 예외를 던집니다
Todo todo = result.orElseThrow();
log.info(todo);
//단위테스트 > 통합테스트 > 시스템테스트로 넘어가기위해서,
//다양한 테스트를 시도해야합니다.
}
@Test
@DisplayName("데이터 수정 테스트")
public void testModify(){
Long tno = 25l;
Optional<Todo> result = todoRepository.findById(tno);
Todo todo = result.orElseThrow();
todo.setTitle("기분좋은날");
todo.setWriter("홍길동");
todoRepository.save(todo);
}
@Test
@DisplayName("데이터 삭제 테스트")
public void testDelete(){
Long tno = 1l;
todoRepository.deleteById(tno);
}
@Test
@DisplayName("페이징 처리 테스트")
public void testPaging(){
//Pageable pageable = PageRequest(페이지번호, 사이즈)
Pageable pageable = PageRequest.of(0,10, Sort.by("tno").descending());
Page<Todo> result = todoRepository.findAll(pageable);
log.info("---------------------------------------");
log.info(result.getTotalElements());
result.getContent().stream().forEach(todo -> log.info(todo));
//페이징처리를 JAP에서 해줍니다.
}
}
●4
#DTO생성
●TodoDTO
package com.shopapi.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import java.time.LocalDate;
@Data //전체 롬복 어노테이션
//@Getter
//@Setter
//@ToString
//@RequiredArgsConstructor
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TodoDTO {
private Long tno;
private String title;
private String writer;
private boolean completed;
//날짜 포맷을 설정하는 어노테이션 : 2024-04-29
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dueDate;
}
#Service생성
●TodoService
package com.shopapi.service;
import com.shopapi.dto.TodoDTO;
public interface TodoService {
//#1. 등록 기능
Long register(TodoDTO todoDTO);
}
ㅡㅡㅡ
●TodoServiceImpl
package com.shopapi.service;
import com.shopapi.dto.TodoDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service //서비스담당
@Transactional // import org.springframework.transaction.annotation.Transactional;
public class TodoServiceImpl implements TodoService {
@Override
public Long register(TodoDTO todoDTO) {
return 0l;
}
}
#라이브러리추가
'7.springBoot > 1)개념_springBoot' 카테고리의 다른 글
springBoot_개념_Day_18 (0) | 2024.05.01 |
---|---|
springBoot_개념_Day_17 (0) | 2024.04.30 |
springBoot_개념_Day_15 (0) | 2024.04.26 |
springBoot_개념_Day_14 (0) | 2024.04.15 |
springBoot_개념_Day_13 (0) | 2024.04.12 |