📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page

Was this helpful?

  1. JPA 책

프로젝트 세팅 및 기본설정

gradle 프로젝트를 만드는데

could not find method compile() for arguments

이러한 에러가 나오길래 찾아봤더니, 기존에 build.gradle을 사용하는 것보다 현재 사용하는 버전이 더 높아서 그렇다고한다..!

기존의 gradle에서는 compile, testCompile을 사용했지만

현재 본인이 사용하는 7.1버전에서는 implementation, testImplementation 을 사용한다는점!

build.gradle

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    all{
        exclude group: "org.springframework.boot", module : "spring-boot-starter-logging"
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation ('org.springframework.boot:spring-boot-starter-web'){
        exclude module : 'spring-boot-starter-tomcat'
    }
    implementation 'org.springframework.boot:spring-boot-starter-undertow'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

톰캣 서버가 아니라 undertow를 사용

  • undertow은 blocking, non-blocking이 모두 사용되도록 설계된 웹 서버

  • 대규모 트래픽으로 부터 톰캣보다 안전하다고 함

  • 그래서 회사에서도 항상 undertow를 사용

log4j2를 사용하기 위해서

  • exclude를 통해서 기존에 제공하고 있는 spring-boot-starter-logging를 제외하고

  • log4j2를 넣어줌

21.12.13 - log4j2 라이브러리에서 엄청난 장애가 발생해버렸다..!

log4j2의 기능중에 어떤 버그가 발생하게 되면 특정 작업을 트리거되게 할 수 있는 기능이 있다. 이 버그를 찾낸 사람들은 마인크래프트를 하다가 찾아냈다고 하던데... 이것이 겜돌이들의 힘..? 쨋든 트리거 기능을 악용해서 클라이언트에서 서버로 공격이 가능하고 서버에서도 서버로 공격이 가능하다..! 트리거 기능을 활용해서 컴터를 끄거나 이상한 프로그램을 실행시키는 것이 가능하다.

실습의 진행을 도커를 사용해서 db를 띄워볼까? 일단 현재는 h2로 진행하기 위해서 application.properties에 h2에 대한 값들을 넣어주자 그리고 추가적으로 필요한 세팅들 추가

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.hibernate.ddl-auto=create-drop
#SQL보기
spring.jpa.properties.hibernate.show_sql=true
#SQL이쁘게 보기
spring.jpa.properties.hibernate.formate_sql=true
#추가적인 주석 추가
spring.jpa.properties.hibernate.use_sql_comments=true
#?에 어떤 값이 들어갔는지 보기
logging.level.org.hibernate.type.descriptor.sql=trace

일단 이렇게만 해두고 h2를 실행하고 테이블을 만들자 - 아근데 이건 mysql같은데.. 일단 회사에서도 오라클을 쓰니까 오라클을 사용하자

create table member(
 ID VARCHAR(255) NOT NULL,
 NAME VARCHAR(255),
 AGE INTEGER NOT NULL,
 PRIMARY KEY (ID)
)
--오라클 버전 테이블 생성
CREATE TABLE MEMBER(
	ID VARCHAR(255) NOT NULL,
	NAME VARCHAR(255),
	AGE NUMBER(3) NOT NULL,
	CONSTRAINT ID PRIMARY KEY
)

이렇게 하고 값을 매핑하기 위해서 클래스를 생성

package SimpleDBObject;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Data
@Entity
@Table(name="MEMBER")
public class Member {
    @Id
    private String id;
    @Column
    private String username;
    private String age;
}

많이 해봤던 것들이다

@Data을 사용해서 getter와 setter등 필요한 롬복기능을 사용

@Entity를 사용해서 해당 클래스를 DB와 매핑할 것이라고 JPA에게 알려줌

@Table을 사용해서 엔티티 클래스에 매핑할 테이블의 정보를 알려준다

  • name 속성을 사용해서 해당 엔티티를 MEMBER 테이블에 매핑

  • 만약에 딱히 @Table을 붙히지 않는다면 알아서 클래스의 이름과 같은 테이블을 찾아서 매핑해줌

@Id를 사용해서 해당 클래스에서 기본 키에 매핑시켜준다

  • @Entity만 붙히면 자동으로 이게 없으면 빨간줄이 나온다!

@Column을 사용해서 각 필드들을 컬럼에 매핑해준다.

  • 만약에 필드와 디비의 컬럼 이름이 같다면 굳이 선언해주지 않아도 알아서 매핑됨!

추가적으로

@Transient을 사용해서 굳이 엔티티의 컬럼에 매핑하지 않겠다는 표시를 해줄 수 있음

엔티티 매니저 사용

엔티티매니저란? → 특정한 작업을 위해서 DB에 접속하는 놈이고 엔티티를 DB에 조회, 등록, 수정, 삭제

package SimpleDBObject;

import javax.persistence.*;

public class JPAMain {
    public static void main(String[] args) {
        //엔티티 매니저 팩토리 생성
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpabook");
        //엔티티 매니저 생성
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        //트랜잭션 가져오기
        EntityTransaction tx = entityManager.getTransaction();
        
        try{
            tx.begin();
            logic(entityManager);
            tx.commit();
        } catch (Exception e){ 
            tx.rollback();
        } finally {
						//엔티티 매니저 종료
            entityManager.close();
        }
        entityManagerFactory.close();
    }
    
    public static void logic(EntityManager em){
				String id = "id";
        Member member = new Member();
        member.setId(id);
        member.setUsername("더미원");
        member.setAge("22");

        //등록
        em.persist(member);

        //수정
        member.setAge("25");

        //조회
        Member found = em.find(Member.class, id);
        System.out.println(found.toString());

        //다수조회
        List<Member> list = em.createQuery("select m from Member m", Member.class)
                .getResultList();
        System.out.println("list.size : "+list.size());

        //삭제
        em.remove(member);
    }
}

엔티티 매니저 팩토리

  • 엔티티 매니저 팩토리는 JPA를 동작시키기 위한 기반 객체를 만들고, JPA 구현체에 따라서 connection pool도 생성하기 때문에 아주 무겁다..!

  • 따라서 엔티티 매니저 팩토리는 애플리케이션 전체에서 한 번만 생성하고 공유해서 사용해야 한다 = 멀티 스레드에서 접근이 가능해야한다

엔티티 매니저

  • JPA의 대부분의 기능을 제공해주는 놈

  • 엔티티를 조회, 등록, 수정, 삭제가 가능하다

  • 엔티티 매니저는 db connection pool과 밀접한 관계가 있기 때문에 스레드 간에 공유하거나 재사용되면 안된다.

  • 다음 장에서 조금 더 자세하게 배울 예정이고 엔티티 매니저는 애초에 웹 앱을 사용하면서 하나가 만들어지기 때문에 위에 코드는 스프링부트에서 실행되지는 않는다. 만약 스프링부트에서 엔티티 매니저를 사용하고 싶다면 @Autowired 키워드를 사용해서 의존성을 주입 받아서 사용하는 방법이 있다.

JPQL : SQL을 추상화한 객체지향 쿼리 언어이다. 이 언어는 SQL을 추상화 했기 때문에 SQL과 문법이 거의 유사해서 어렵지 않게 사용할 수 있다.

  • JPQL은 엔티티 객체를 대상으로 쿼리를 한다(자바 코드를 대상으로 쿼리를 적용한다는 뜻)

    • JPQL은 엔티티 객체를 대상으로 하기 때문에 디비 테이블을 모른다.

  • SQL은 디비를 직접적으로 쿼리한다.

PreviousJPA 책Next영속성 관리 개념

Last updated 3 years ago

Was this helpful?

LogoLog4J2 Vulnerability and Spring Bootspringcentral
스프링에서 공식적으로 이야기한 버그와 해결책