Recent Posts
-
[QueryDSL] 동적 쿼리 (BooleanExpression)
QueryDSL은 SQL자체를 자바 코드로 작성하기 때문에 TypeSafe하고 컴파일 시점에 오류를 발견할 수 있다는 장점이 존재한다. 더불어서 QueryDSL의 가장 큰 장점 중 하나는 "동적 쿼리 생성의 편리함"이다 QueryDSL에서 where절에 동적 쿼리를 생성하기 위해서는 "BooleanExpression"을 활용하면 된다 BooleanExpression BooleanExpression을 return하는 "동적 쿼리 전용 메소드"를 만들면 굉장히 편리하게 특정 조건에 따른 동적 쿼리를 작성할 수 있다 Integer ageUpper = 25; String userNameContains = "nus1"; List fetch = query.selectFrom(member) .where(member...
-
[QueryDSL] 프로젝션, DTO 조회
프로젝션 프로젝션이란 "Select절에 조회 대상을 지정"하는 것이다 대상 하나 조회대상이 하나라면 Return Type은 해당 조회 대상의 Type으로 정해진다 // Projection [Member] List fetch1 = query.select(member) .from(member) .where(member.age.goe(25)) .fetch(); // Projection [String] List fetch2 = query.select(member.username) .from(member) .where(member.age.goe(25)) .fetch(); // Projection [Integer] List fetch3 = query.select(member.age) .from(member) .wh..
-
[QueryDSL] Join & SubQuery
QueryDSL Join QueryDSL에서는 JPQL에서 지원하는 [InnerJoin, LeftOuterJoin]은 당연하게 사용할 수 있고 더해서 [RightOuterJoin]도 사용할 수 있다 추가적으로 on절과 더불어서 성능 최적화를 위한 FetchJoin도 활용할 수 있다 InnerJoin 첫번째 파라미터(Root Entity에 대한 조인 대상) 두번째 파라미터(조인 대상의 Alias) List fetch = query.selectFrom(member) .innerJoin(member.team, team) .where(member.age.goe(25).and(team.name.eq("Team-A"))) .fetch(); for (Member member : fetch) { System.out.p..
-
[QueryDSL] 정렬 & 페이징
정렬 QueryDSL에서의 정렬은 "orderBy()"메소드를 통해서 내부적으로 정렬 기준의 필드에 대해서 [asc(), desc()]를 통해서 정렬하면 된다 // 25살 이상 Member들에 대한 "나이 오름차순/이름 내림차순 정렬" List fetch = query.selectFrom(member) .where(member.age.goe(25)) .orderBy(member.age.asc(), member.username.desc()) .fetch(); 페이징 페이징은 "offset() & limit()"를 통해서 시작 지점/페이징 개수를 적절하게 조합해서 활용하면 된다 offset번째부터 limit개수의 페이징 처리를 한다는 의미이다 QueryDSL에서 offset의 가장 처음 기준은 "0"이다 P..
-
[QueryDSL] 기본적인 조회
JPAQueryFactory 기본적으로 QueryDSL을 통해서 query를 생성하기 위해서는 "JPAQueryFactory"로부터 쿼리를 생성해야 한다. 하지만 JPAQueryFactory가 필요한 모든 곳에서 JPAQueryFactory를 가져오는 것은 큰 낭비이고 JPAQueryFactory를 사용하기 위해서는 "EntityManager"도 필요하기 때문에 불편하다 >> JPAQueryFactory를 @Bean을 통해서 빈으로 등록해버리면 프로젝트 전역에서 편리하게 JPAQueryFactory를 사용할 수 있게 된다 @Configuration public class QueryDSLConfig { @PersistenceContext private EntityManager em; @Bean JPAQue..
-
[QueryDSL] QueryDSL 기본 설정
1) build.gradle 의존성 추가 dependencies { ... ... //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } querydsl-jpa = QueryDSL의 JPA 라이브러리 querydsl-apt = QueryDSL에서 사용할 "쿼리 타입(Q)"를 생성할 때 필요한 라이브러리 jakarta.anno..
-
[Spring Data JPA] Web Binding
Parameter로 Member의 id(PK)가 넘어오고 이를 통해서 멤버를 조회하는 일반적인 로직을 작성해보자 // Controller @RestController @RequiredArgsConstructor public class TestController { private final MemberService memberService; @GetMapping("/member") public Member getMember(@RequestParam Long id) { return memberService.findMember(id); } } // Service @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class Memb..
-
[Spring Data JPA] 사용자 정의 Repository
일반적으로 Spring Data JPA를 활용하면 인터페이스만 정의하고 그에 대한 구현체는 정의하지 않는다 왜냐하면 Spring의 ProxyFactory에 의해서 정의한 인터페이스에 대한 "프록시"를 생성하고 이 프록시 내부적으로 실제 JpaRepository의 구현체인 "SimpleJpaRepository"를 호출하도록 설계되었기 때문이다 private final MemberRepository memberRepository; @Test @DisplayName("Spring Data JPA 인터페이스 프록시 확인") void proxyTest() { System.out.println(memberRepository.getClass()); assertThat(AopUtils.isAopProxy(memberR..
Popular Posts
-
[Data Structure] LPT 알고리즘 (히프)
머신 스케줄링 - 동일한 기계 m개, 처리해야 하는 작업 n개가 존재 모든 기계를 가동해서 가장 최소의 시간 안에 작업을 모두 끝내는 것 = 머신 스케줄링 - 각 작업마다 완료까지 걸리는 시간이 다름 종료 시간이 최소인 기계를 선택 해당 기계에 작업시간이 최대인 작업을 할당한다 ▶ LPT 알고리즘 - ex) 여러 서버에 작업을 분배 할 경우, 가장 효율이 좋은 최적의 해(근사의 해)를 찾는 알고리즘 - 항상 종료시간이 최소인 기계를 선택 → 최소 히프를 통해서 구현 ----------------------------------------------------------------------------------------------------------- 기계들을 최소 히프에 전부 insert 최소 히프..
-
[AI] 전통적 계획 수립 - PDDL
Planning (초기 상태 → 목표 상태)에 도달하기 위한 "Sequence Of Action"을 찾아내는 것 ※ 계획 수립 (초기 상태 → 목표 상태)에 도달하기 위한 "Sequence Of Action"을 찾기 위해서 필요한 여러가지 환경/요소 등을 정의하는 것 >> 이렇게 도출된 Solution Plan은 "Optimal"해야 한다 최소 비용으로 목표에 도달 전통적 계획 수립의 여러가지 가정들 1. Environment [AI] Agent Agent (Rational Agent) 1. 자신이 놓인 환경에 대해서 "센서"를 통해서 환경에 대한 상태를 "추정" (Sensor Value 획득) 환경이 현재 어떤 상태인가 그 환경 속에서 나는 어떤 상태인가 2. Effectors를 통해서.. cs-ssu..
-
[DB] ER 모델을 관계 데이터 모델로 변환
데이터베이스 시스템(DBS) 개발 단계 ER 스키마를 관계 모델 릴레이션으로 변환 [규칙 1] 개체 타입 : 강한 개체 타입 -> 사원(사원번호, 사원 이름) [규칙 2-1] 속성 : 복합 속성(Composite Attribute) -> 고객(고객 아이디, 년, 월, 일) [규칙 2-2] 속성 : 다중값 속성(Multi-Valued Attribute) - 원래 개체의 릴레이션 속성에 다중값 속성을 포함시키지 않는다 - 다중값 속성은 따로 릴레이션을 만든다 - 다중값 속성 릴레이션의 기본키 = 원래 개체의 기본키(FK) + 다중값 속성 -> 고객(고객 아이디, 고객명) -> 고객 연락처(고객 아이디(FK), 연락처) [규칙 3-1-1] 관계 타입 : 2항 관계 / 1:1 관계 ※ 관계 타입 R에 대하여 R..
-
[AI] CSP : Constraint Satisfaction Problem
CSP (제약 만족 문제) 대학교 시간표를 짤때도 여러 강의를 자신의 시간표로 넣을 때 각 강의간에 제약조건에 존재한다. 이러한 과정을 통해서 시간표를 완성했다면 우리는 "시간표 짜기"라는 문제에 대한 제약 조건을 만족했다고 할 수 있다 "인공지능"의 많은 문제들은 제약 조건을 만족시켜가면서 해결하는데 이러한 문제의 Goal State는 "주어진 제약 조건을 만족"시킨 상태이다. CSP의 3가지 요소 1) Variable 문제에서 제약 조건을 만족시켜줘야 하는 "변수들" - 각 변수들 사이에는 제약조건이 존재하고, 제약조건을 만족하도록 각 변수에 Domain 값을 설정해줘야 한다 2) Domain 변수에 할당되는 "값들의 집합" - 제약조건을 만족할 수 있도록 변수들에 Domain 값을 잘 설정해줘야 한..
-
[Spring Data JPA] 페이징 & 정렬
JPQL을 통해서 페이징을 하기 위해서는 [setFirstResult(), setMaxResults()]를 통해서 페이징 처리를 하였다. 그리고 정렬을 하기 위해서는 직접 SQL Query에 정렬 기준을 명시해주었다 하지만 Spring Data JPA에서는 다음 2가지 특별한 파라미터를 제공해주고, 이 파라미터들을 통해서 페이징/정렬을 굉장히 편리하게 구현할 수 있다 org.springframework.data.domain.Sort = 정렬 org.springframework.data.domain.Pageable = 페이징 기능 (내부에 Sort 포함) 페이징에 대한 return type으로는 List/Page를 사용할 수 있다. Page는 기본적으로 Slice를 확장한 인터페이스이고, 반환타입으로 Pa..
-
[JPA] 조건식
1. 타입 표현 JPQL에서 타입 표현은 대소문자를 구분하지 않는다 (1) 문자 문자 타입은 작은따옴표(')로 감싸서 표현해준다 List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN 'Avenus3' AND 'Avenus6'", Member.class ).getResultList(); List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN \"Avenus3\" AND \"Avenus6\"", Member.class ).getResultList(); 이렇게 문자 타입은 큰따옴표(")로 ..
-
[컴퓨터구조론] 2장 연습문제
[2.1] 클록 주기가 2ns인 CPU가 'ADD addr' 명령어를 인출하고 실행하는 데 걸리는 시간은 모두 몇 ns인가? "ADD addr" ## 인출 사이클 ## t(0) : PC -> MAR t(1) : M[MAR] -> MBR / PC + 1 -> PC t(2) : MBR -> IF ## 실행 사이클 ## t(0) : IR(addr) -> MAR t(1) : M[MAR] -> MBR t(2) : AC + MBR -> AC -> 총 6개의 CPU 클록 주기만큼의 시간 = 6 X 2ns = 12ns [2.2] 인터럽트 서비스 루틴을 수행하는 도중에 더 높은 우선순위를 가진 인터럽트 요구가 들어오더라도 그 루틴의 수행이 중단되지 않도록 하는 방법을 설명하라 ISR을 실행할 때, "인터럽트 불가능" 명..
-
[컴퓨터구조] 명령어 파이프라이닝
명령어 파이프라이닝 (Instruction Pipelining) - CPU의 성능 ≒ 컴퓨터시스템의 프로그램 처리 시간에 직접적 영향 속도를 향상시키면 향상시킬수록 매우 좋다 속도를 향상시키는 방법 중 하나 : 명령어 파이프라이닝 ≫ 매우 간단하면서 분명한 효과 1. 명령어를 실행하는데 사용되는 하드웨어를 여러 개의 독립적인 단계(stage)들로 분할 2. 각 단계별로 동시에 서로 다른 명령어들을 처리 → CPU 성능 향상 3. 분할되는 단계가 많이질수록 CPU의 성능은 향상 가장 효율적인 파이프라인 조건 - 각 단계별 처리 시간 일정 - 각 명령의 처리 단계 균일 2-단계 명령어 파이프라이닝 - 명령어 사이클은 기본적으로 인출 사이클/실행 사이클 : 2개의 단계로 구성 이 2개의 단계들을 처리하는 하드..
