Programming/Spring, SpringBoot
- JPQL의 단점 : 문자열의 형태로 작성하여 정상적으로 작성되었는지는 실행해봐야 알 수 있다. 복잡한 쿼리를 작성하기 어렵고, 상황에 따라 조건을 달리해서 조회하는 동적 쿼리를 만들기 어렵다. 1. Querydsl - 목표 : 데이터를 조회하는 여러 맥락에 대하여 같은 Java 코드로 데이터를 조회하는 것을 목표로 한다. (JPA, SQL, Lucene(검색 엔진), Mongodb(NoSQL DB) 등) >> 실행 중(런타임)에만 오류를 확인할 수 있다는 JPQL의 단점이 해소된다. http://querydsl.com/
1. N+1 문제 - JPA라는 ORM을 사용하기 때문에 SQL(JPQL)을 작성할 필요가 없다. 하지만, ORM도 결국 데이터베이스와 소통을 대신할 뿐 어느 시점에 SQL을 데이터베이스에 전달한다. >> spring.jpa.show-sql 설정을 true로 설정하면 Hibernate가 실제 실행하는 쿼리문을 볼 수 있다. - studentRepository.findAll();을 실행하면? @GetMapping("simple-find") public String simpleFind() { studentRepository.findAll(); return "done"; } : Student만 조회하려고 하지만, Instructor도 조회하려는 SQL이 있다. 왜냐하면 Student 엔티티 내부의 Instru..
: 데이터베이스에 다수의 사용자가 동시에 접근하는 경우 적절히 통제하지 않으면 데이터 무결성에 문제가 발생할 수 있다... >> 데이터베이스 자원을 잠궈서 읽거나 쓰는 것을 방지하자! 1. 낙관적 락 (Optimistic Lock) : 데이터를 갱신해야 하는 시점에 데이터가 처음 조회했을 때의 시점에서 변화하지 않았다는 것을 바탕으로 실행될지 안될지를 결정한다. - 실제로 데이터베이스의 자원을 잠그지는 않음. 1) 트랜잭션 시작에 갱신하고 싶은 데이터 먼저 확인 2) 데이터 수정을 위한 작업 진행 3) 커밋 직전, 현재 상태와 처음 데이터를 불러온 상태의 특정 컬럼 비교 4) 변경이 없다면 그대로 커밋, 변경이 있다면 충돌 상황을 조치. - 변경사항이 생겼다는 사실을 기록할 컬럼이 필요! - 접근 자체를..
1. 영속성 컨텍스트 1) 영속성 : 데이터가 프로그램이 종료되고 난 뒤에도 남아있는 특성. - Java에서 만드는 변수와 객체는 전부 휘발성 (Heap에서 관리하다 변수가 사라질 때 객체 데이터를 삭제하게 된다) >> 영속성이 없다! - 파일(DB)의 형태로 저장. 서버가 종료되어도 데이터가 남아있음. > 영속성 2) 영속성 컨텍스트 : JPA를 사용하면 데이터베이스와 JPA 사이에 영속성 컨텍스트를 만든다. - Spring Boot와 데이터베이스 사이의 Entity용 가상 데이터베이스! - 실제 영속성 컨텍스트와 소통하는 객체는 EntityManager. >> 이를 편의성 있게 사용할 수 있도록 하는 인터페이스가 Spring Data JPA! - 1차 캐시 (First Level Cache) : 어떤..
Spring Data JPA의 Query Methods는 간단하게 메서드의 이름을 바탕으로 조회하는 데이터의 조건을 지정할 수 있어서 매우 간편하다. 그러나, 이름이 길어진다는 점, 조금 복잡한 조건, 집계함수 등을 활용하기 어렵다는 단점이 있다. => 직접 실행할 SQL을 작성하기 위해서 @Query 어노테이션을 활용할 수 있다. ex) ERD 더보기 1. @Query : 어노테이션으로 MyBatis의 Mapper Annotation처럼 SQL을 직접 작성할 수 있게 해주는 기능. 1) JPQL과 SQL - JPQL (Java Persistence Query Language)라는 언어를 기본으로 사용. (엔티티와 속성을 바탕으로 동작하는 언어) - 또는 그냥 SQL을 전달할 수 있다 -> nativeQ..
1. ManyToMany 1) Entity 관계 M : N 관계 ex) 게시글과 좋아요 관계 - 하나의 게시글은 여러 사용자에게 좋아요를 받는다. + 한 명의 사용자는 여러 게시글에 좋아요를 남길 수 있다. 강의와 학생의 관계 - 한 학생은 여러 강의를 듣는다. + 한 강의에는 여러 학생이 참석한다. - 이러한 M : N 관계를 표현하기 위해서 양쪽 테이블의 PK를 외래키로 갖는 새로운 테이블을 별도로 만들게 된다. 2) Entity 만들어보기 - Student // Student Entity class @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private S..
1. MappedSuperclass @MappedSuperclass : 다른 Entity가 상속 받아서 내가 가진 속성 정보를 포함시키고 싶을 때 상속 받는 Entity 클래스임을 나타내는 어노테이션 - 이렇게 만들어진 클래스는 다른 클래스가 상속받는 것이 목표이기 때문에! 실제로 테이블이 생성되지는 않는다. ex) Article, Comment 엔티티에 공통으로 가진 속성 정보 id BaseEntity 추상 클래스를 만들고 @MappedSuperclass 어노테이션을 붙여 Article, Comment에서 상속받는다. - BaseEntity // BaseEntity abstract class @MappedSuperclass @Getter public abstract class BaseEntity { /..
네이버 로그인도 성공했으니,,,,! 카카오 로그인 도전! 1) 애플리케이션 등록. (API 이용신청) : https://developers.kakao.com/ Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다. developers.kakao.com - 내 애플리케이션 > 애플리케이션 추가하기 - 생성 후 애플리케이션에 들어가보면 카카오 로그인 부분이 있다. 활성화를 해두면 됨 ON! 동의화면 미리 보기도 가능하다. 근데 여기서 팁은 왼쪽 동의항목 메뉴를 눌러보면 닉네임, 프로필 사진, 카카오계정(이메일), 카카오 서비스 내 친구목록 제외하고 나머지는 모두 권한 없음.이라고 나온다... ..
1. OAuth2 (Open Authorization) : 다른 서비스 제공자를 통해 사용자의 정보를 안전하게 위임받기 위한 표준. - 사용자가 어떤 서비스에 소셜 로그인을 진행하고 싶을 때 해당 서비스에 직접적으로 인증을 위한 정보 (아이디, 비밀번호)를 제공하지 않더라도 서비스 제공자 측에 기록된 나의 정보를 조회할 수 있도록 권한을 위임하는 기술. 1) 사용자가 로그인이 필요한 서비스 요청 2) 사용자가 소셜 로그인 제공자 선택 3) 사용자가 선택한 소셜 로그인 화면으로 redirect 4) 제공자(소셜 서비스) 인증 화면에 사용자가 인증정보 전달 5) 정상적인 인증 정보일 경우 > access token 발급하여 미리 설정된 url로 전달 6) access token을 사용하여 제공자의 자원 서버..