
인프런 김영한 선생님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의에서 SQL 중심적인 개발의 문제점에 대해 학습한 내용을 정리한다. ✔ 연관관계 객체는 연관관계 시 참조 사용 : member.getTeam() 테이블은 외래 키 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID 객체에서는 Team -> Member로 이동할 수 없지만 테이블에서는 Team에서 FK를 이용해 Member의 데이터로 가고 싶으면 member와 team을 조인해서 이동할 수 있다. ✔ ORM이란? 🤔 Object-relational mapping(객체 관계 매핑) 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터배이스대로 설계하면 ORM 프레임워크가 중간에서 매핑을 해주는 것을 의미 대중적인 ..

🤔 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티 📌 준영속 엔티티를 수정하는 2가지 방법 변경 감지 기능 사용 @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다. } 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 => 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)이 동작해서 데이터베이스..

인프런 김영한 T의 실전! 스프링 부트와 JPA 활용1 강의를 들으며 연관관계 매핑 과정에 대해 정리한다. erd 설계 후 엔티티 매핑 과정시에 내가 참고할 용도로 제작하였다. 독자들도 erd 설계 후 이 방식에 맞춰 엔티티 클래스를 개발하면 될 것 같다. 바로 들어가보자. 📌 @--ToMany ✔ (mappedBy = "") 적용 ✔ 예시 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List orderItems = new ArrayList(); 📌 @--ToOne ✔ (fetch = LAZY) 적용 ✔ @JoinColumn(name="") 적용 ✔ 예시 @OneToOne(fetch = LAZY, cascade = CascadeTy..

오늘은 @Enumerated란 무엇이며 언제 어떻게 사용해야하는지 알아보자. 엔티티 매핑에서 Enum 타입을 사용할 때 @Enumerated 어노테이션을 사용하는데 우선 @Enumerated 어노테이션의 종류는 두 가지이다. ✔ EnumType.ORIGINAL : enum 순서(숫자) 값을 DB에 저장 ✔ EnumType.STRING : enum 이름 값을 DB에 저장 예시를 들어보자. 다음과 같은 enum 클래스에서 어노테이션의 종류가 EnumType.ORIGINAL이라면 ORDER ==> 1로 저장 CANCEL ==> 2로 저장된다. 어노테이션의 종류가 EnumType.STRING이라면 "ORDER", "CANCEL" 로 저장된다. ❌ 근데 EnumType.ORIGINAL은 함부로 사용할 수 없다. ..

오늘은 @Embedded는 무엇이며 언제 어떻게 사용하는지에 대해 알아보자. 바로 시작해보자. 🔥 회원 엔티티가 다음과 같다고 가정해보자. 회원 엔티티는 이름, 도시, 주소 번지, 주소 우편번호를 가진다. 이때 도시, 주소 번지, 주소 우편번호는 회원의 '주소'를 알기 위해 가지는 컬럼들이다. 이때 상세 데이터(도시, 주소 번지, 주소 우편번호) 또한 하나의 객체로 묶어 보다 객체지향적으로 설계할 수 있다. 도시, 주소 번지, 주소 우편번호를 주소라는 객체로 묶어 표현하면 보다 객체지향적인 코드가 될 것이다. 이때 사용하는 것이 @Embedded, @Embeddable이다. @Embeddable @Getter public class Address { private String city; private S..

엔티티 설계시 주의할 점에 대해 학습한 내용을 정리한다. 같이 알아보도록 하자. ✔ 엔티티에는 가급적 Setter를 사용하지 말자! - Setter는 변경 가능하기 때문에, 유지보수가 어렵다. ✔ 모든 연관관계는 지연로딩으로 설정하자! - 즉시로딩(Eager)은 예측이 어렵고, 어떤 SQL이 실행될 지 추적하기 어렵다. 특히나 JPQL을 실행할 때 N+1 문제가 발생할 수 있다! @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이르모 직접 지연로딩으로 설정해야한다! ✔ 컬렉션은 필드에서 초기화하자. - null 문제로부터 안전하기 때문이다. 별 내용 없어 보여도 굉장히 중요한 내용이니 꼭 기억하자!! 그럼 오늘도 열심히 개발하자. 🔥

일반적인 웹 애플리케이션 계층 구조에 대해 알아보자. 컨트롤러 : 웹 MVC의 컨트롤러 역할 서비스 : 핵심 비즈니스 로직 구현 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인 : 비즈니스 도메인 객체, ex.회원,주문,쿠폰 등 주로 데이터베이스에 저장하고 관리됨. 클래스 의존관계에 대해 알아보자. 🤔 MemoryMemberRepository를 사용하는 이유 => 개발 과정 중에 아직 DB가 정해지지 않았을때 memory 구조로 설계하고 나중에 DB 연결함.

이전 포스팅(글자클릭시 이동)에서 querydsl이란 무엇이며 왜 사용하는지에 대해 포스팅했으므로 이전 포스팅을 꼭 참고하기를 바란다. 캡스톤 프로젝트 중 '검색 기능' 을 위해 동적 쿼리를 사용하게 되었고 Querydsl을 설정하는 포스팅을 작성해볼까 한다. 바로 들어가보자. 😊 (queryDslVersion 5.0.0이후부터는 설정이 조금 달라졌다고 하는데 이 포스팅은 queryDslVersion 5.0.에 해당한다.) 1. build.gradle 파일에 다음과 같은 코드를 추가한다. 코드를 추가하고 실행시키면 build>generated>querydsl[main]에 Q로 시작하는 도메인들이 생긴다. Q로 시작하는 도메인들이 보인다면 제대로 한 것이다!! 😊 보이는 것과 같이 Q로 시작하는 도메인이 ..

오늘은 querydsl이란 무엇이며 왜 사용하는지에 대해 알아보자. JPA에는 쿼리 메서드의 기능과 @Query를 통해 많은 기능을 만들 수 있지만, 고정된 형태의 값을 가진다는 단점이 있다. 즉, 단순한 검색 조건을 만들어야 하는 상황에서는 충분히 사용가능하지만, 복잡한 조합을 이용하는 경우의 수가 많은 상황에서는 동적으로 쿼리를 생성해서 처리할 수 있는 기능이 필요하다. 📌 이때 Querydsl을 사용한다!! querydsl을 사용하면 복잡한 검색조건이나 조인, 서브 쿼리 등의 기능도 구현이 가능하다! Querydsl 공식 사이트

지난 포스팅에선 gradle을 이용한 스프링 프로젝트를 생성해보았다. 오늘은 생성한 프로젝트에 DB(mariadb)를 연결하고 추가로 프로젝트 설정을 진행해보자. 우선 mariadb를 설치한다. 1. Mariadb를 실행하면 나오는 세션 관리자에서 다음과 같이 세션을 등록한다. 2. 새로 생성한 세션으로 접속 후 마우스 우클릭 -> 새로 생성 -> 데이터베이스를 클릭한다. 3. IntelliJ 설정 IntelliJ의 build.gradle 파일의 dependencies에 다음과 같이 추가한다. 4. application.properties 파일에 다음 내용 추가하기 application.properties 파일에 다음과 같이 database를 연결한다. 🤔 서버를 실행해보자. 잘 동작하는 것을 볼 수 있..

오늘은 스프링으로 프로젝트 생성하는 방법에 대해 공부해보자. 필자는 gradle을 이용하여 스프링 프로젝트를 생성하겠다. 먼저 다음의 사이트에 접속한다. https://start.spring.io/ 사이트에 접속해 다음과 같이 옵션을 선택하고 GENERATE를 클릭한다. 생성된 zip 파일을 풀어 IntelliJ(통합개발환경)에서 해당 파일을 열면 된다. 다음과 같이 프로젝트의 구조가 생성되면 스프링 프로젝트의 생성은 끝이다. 다음 포스팅에선.. 지금 생성한 프로젝트를 바탕으로 DB 연결(mariadb) 및 기초 설정을 공부해보자. 그럼 오늘도 즐겁게 개발하자. 😊

개발을 하던 도중 DTO와 VO의 차이에 대해 궁금해졌다. 🤔 우선 DTO란? Data Transfer Object의 약자로 순수하게 데이터를 담아 계층 간으로 전달하는 객체이다. 로직 없이 순수하게 데이터만 전달하는 것으로써 getter/setter 메서드가 이에 해당한다. 🤔 VO란? Value Object의 약자로 특정 값 자체를 표현하므로 불변성을 보장하기 위해 생성자를 사용하여야 한다. VO는 값자체를 나타내므로 setter 같은 새로 값을 지정하는 메서드가 존재해선 안된다! (왜냐? 불변성을 보장해야하기 때문) 좀 더 쉬운 말로 DTO는 데이터를 담아 계층 간으로 전달한다. 값을 가져오고 (get) 전달해 지정한다.(set) 그럼 VO는 특정 값 자체를 표현한다. ✔ VO와 DTO의 차이점? ..

오늘은 필자의 이전 포스팅에서 설명하기로 했던 equals와 ==의 차이에 대한 포스팅을 진행하겠다. ('이전 포스팅' 클릭) 이전 포스팅에서도 말했지만 👉 equals와 ==의 차이점을 소개하자면 equals의 경우 메서드이기 때문에 ()안의 내용을 비교한다. 📌 즉 두 대상의 값 자체를 비교한다! ==의 경우 객체의 주소를 비교한다. 기본 타입 int형, char형 등은 대상에 주소값을 가지지 않고 쓰이기 때문에 ==(동등비교)가 가능하지만 String은 클래스 이기 때문에 생성할 때마다 새로운 주소값이 부여된다. 📌 그래서 String 타입의 경우 '값' 자체는 같아도 '주소'는 다르다!! 말만 들어선 이해가 어려울 수 있으니 직접 코드를 통해 확인해보자!! 🤔❓ 우선 필자가 위에서 설명한 것을 바..

JPA의 플러시에 대해 알아보자. 이전 포스팅과 연결되므로 이전 포스팅을 참고하길 바란다. (이전 포스팅 글씨를 누르면 이동할 수 있다.) 🤔 플러시는 언제 발생할까? 데이터 베이스 트랜잭션이 일어나면 플러시는 자동으로 일어난다! 지난 포스팅에서 db에 쿼리는 commit할 때 날아간다고 했다. 그런데 만약 내가 comimit 하기 전에 db에 쿼리가 제대로 날아가는지 확인하고 싶다면 어떻게 해야할까? 바로 이렇게 하면 된다 em.flush()를 하게 되면 db에 쿼리가 바로 날아간다. 그럼 확인해보자. 보이는가? 구분을 위해 그어둔 ================선이 쿼리문 뒤에 나타났다. 플러시에 대해 정리해보자 플로시는 영속성 컨텍스트를 비우지 않고, 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화..

오늘은 JPA의 영속성 관리에 대해 알아보자. 이전 포스팅과 이어지는 내용이므로 이전 포스팅을 참고하기를 바란다. JPA에서 필수로 알아야 할 단어 중 하나인 '영속성 컨텍스트'에 대해 알아보자. 영속성 컨텍스트란, 엔티티를 영구 저장하는 환경을 의미한다. EntityManager.persist(entity)로 엔티티를 영속성 컨텍스트에 저장한다. 엔티티는 생명주기가 있다. 비영속(new/transient) 우리가 흔히 new 연산자를 이용해 객체를 생성한 상태는 영속성 컨텍스트와 관계가 없는 새로운 상태를 의미한다. 영속(managed) EntityManager.persist(entity)를 하게 되면 영속 상태가 되는데 영속성 컨텍스트에 '관리'되는 상태이다. 위 사진에서 설명한 대로 Member 객..
- Total
- Today
- Yesterday
- 소스코드
- 백준
- 해커랭크 챌린지
- JPA
- challenges
- 정보처리산업기사 공부법
- 정보처리 산업기사
- 나동빈
- 챌린지
- 22 정보처리 산업기사
- 해커랭크 자바
- 해커랭크 자바 챌린지
- stack
- 그리디
- 정보처리산업기사
- 이코테
- 강의
- LinkedList
- 22 정보처리산업기사
- Java
- 자바
- hackerrank challenges
- hackerrank
- 코드
- ORM
- 해커랭크
- queue
- 자바의 정석
- BAEKJOON
- 디버깅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |