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
-
[컴퓨터구조론] 4장 연습문제
[4.1] 그림 4-2의 제어 기억장치의 용량을 256단어로 확장하고, 각 실행 사이클 루틴이 최대 8개의 마이크로-연산들로 구성될 수 있도록 하려면, 그림 4-3의 사상 함수는 어떻게 바뀌어야 하는가? (1) 제어 기억장치의 용량이 256단어 >> 사상 함수 전체 길이 = 8 (2) 실행 사이클은 절반-끝 부분에 위치 >> 사상 함수 첫번째 값 = 1 (3) 각 루틴은 최대 8개의 마이크로-연산들로 구성 >> 사상 함수 끝 3자리를 0으로 만들기 -----> result : 1 XXXX 000 [4.2] 제어 기억장치의 전체 용량이 128 단어이고, 실행 사이클 루틴들의 처음-절반 부분에 저장된다고 하자. 각 루틴이 최대 4개씩의 마이크로명령어들로 구성된다면, 그림 4-3의 사상 함수는 어떻게 변경되어..
-
[컴퓨터구조] 명령어 파이프라이닝
명령어 파이프라이닝 (Instruction Pipelining) - CPU의 성능 ≒ 컴퓨터시스템의 프로그램 처리 시간에 직접적 영향 속도를 향상시키면 향상시킬수록 매우 좋다 속도를 향상시키는 방법 중 하나 : 명령어 파이프라이닝 ≫ 매우 간단하면서 분명한 효과 1. 명령어를 실행하는데 사용되는 하드웨어를 여러 개의 독립적인 단계(stage)들로 분할 2. 각 단계별로 동시에 서로 다른 명령어들을 처리 → CPU 성능 향상 3. 분할되는 단계가 많이질수록 CPU의 성능은 향상 가장 효율적인 파이프라인 조건 - 각 단계별 처리 시간 일정 - 각 명령의 처리 단계 균일 2-단계 명령어 파이프라이닝 - 명령어 사이클은 기본적으로 인출 사이클/실행 사이클 : 2개의 단계로 구성 이 2개의 단계들을 처리하는 하드..
-
[컴퓨터구조] CPU의 기본 구조
CPU - 컴퓨터의 핵심 요소 - 기억장치에 저장되어 있는 명령어들을 실행 : "프로그램 수행" CPU의 프로그램 수행 과정 (기능) ① 명령어 인출 (Instruction Fetch) - 무조건 실행 - 기억장치로부터 명령어 읽기 ② 명령어 해독 (Instruction Decode) - 무조건 실행 - 해당 명령어 해독 어떤 동작을 수행해야하는지 결정해야 하기 때문에 ③ 데이터 인출 (Data Fetch) - 명령어를 수행할 때 Data가 필요한 경우, (기억장치, I/O장치)로부터 해당 Data를 읽기 ④ 데이터 처리 (Data Process) - 해당 Data에 대한 산술/논리연산을 수행 ⑤ 데이터 저장 (Data Store) - 수행 결과 저장 → ①, ②는 무조건 실행 / ③, ④, ⑤는 명령어..
-
[Spring Data JPA] 쿼리 메소드 기능
더보기 ## 쿼리 메소드 기능을 테스트할 기본적인 엔티티 구성 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @Column(name = "user_name", length = 50) private String username; private Integer age; @Enumerated(EnumType.STRING) private MemberType type; @Column(..
-
[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..
-
[컴퓨터구조] 제어 유니트
제어 유니트 (Control Unit) CPU에서 명령어를 인출하여 해독하고 실행하는 과정이 순차적으로 발생하기 위해서 순간마다 적절한 제어 신호를 생성해서 해당 하드웨어 모듈로 보내주는 장치 - 기능 1) 명령어 코드의 해독 - 기능 2) 명령어 실행에 필요한 제어 신호 생성 ≫ 명령어 사이클이 적절히 수행되도록 모든 동작들을 제어하는 장치 - 명령어 사이클에는 인출 사이클/간접 사이클/실행 사이클/인터럽트 사이클로 구성 각 사이클에는 여러 개의 마이크로-연산들이 수행된다 Example) 인출 사이클 t(0) : PC -> MAR t(1) : M[MAR] -> MBR / PC + 1 -> PC t(2) : MBR -> IR - t(1)에서는 두 개의 마이크로-연산이 동시에 수행된다 - 각 마이크로-연산..
-
[명품 Java] 11장 실습문제 (기본적인 스윙 컴포넌트와 활용)
[11장 1번] 아래 그림과 같이 2개의 체크박스와 버튼을 하나 만들어라. "버튼 비활성화" 박스를 선택하면 버튼이 작동하지 못하게 하고, 해제하면 다시 작동하게 하라. "버튼 감추기" 체크박스를 선택하면 버튼이 보이지 않도록 하고 해제하면 버튼이 보이도록 하라. package Java11_1; import javax.swing.*; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; public class Java11_1 extends JFrame{ Java11_1(){ super("CheckBox Practice Frame"); setDefaultCloseOperation(JFrame.EXIT_O..
-
[명품 Java] 10장 연습문제 (자바의 이벤트 처리)
[10장 1번] 자바의 이벤트 기반 프로그래밍에 대한 설명으로 틀린 것은? 1. 이벤트 분배 스레드가 존재한다 2. AWT나 스윙 응용프로그램은 이벤트 기반 응용프로그램이다 3. 키 이벤트를 처리하는 도중 마우스 이벤트가 발생하면, 마우스 이벤트를 처리한 뒤 중단시킨 키 이벤트 처리를 계속 한다 4. 컴포넌트마다 처리할 수 있는 이벤트가 서로 다르다 [10장 2번] MouseEvent 객체가 제공하지 않는 정보는 무엇인가? 1. 이벤트 소스 2. 마우스 클릭된 화면 좌표 3. 클릭된 마우스 버튼 번호 4. 마우스 드래깅 길이 [10장 3번] 다음 프로그램 코드를 익명 클래스를 이용하여 다시 작성하라 JButton btn = new JButton("Hello"); btn.addActionListener(n..