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
-
[컴퓨터구조론] 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을 실행할 때, "인터럽트 불가능" 명..
-
[HW] Java 기반의 AES 복호화 프로그램
아래의 key, IV, Ciphertext를 통해서 plaintext 구하기 "각 값들은 Base64 인코딩되어 제공된다" ## key ## 8iE3bf1se6N76HGPP8S0Xw== ## IV ## cHml3oX848/0uBwDJtChOA== ## Ciphertext ## QDr9NZNG9Bgc3TTnfRuqjjzf/kVSYwbP7F9mR4GQZ/IneIh7HTc/xnwzEeVBc H3pPlIbLFySKZruedJc9X87CGNDJ1f2Dat8BR3Ypbei5Q42xc306/AkSuGsjfqb X9/ELxmdKn7MyvY/Jbc0v0AJHV6odgNzygKRRrFJcUIF/50= ## 암호화 모드 ## AES/CBC/PKCS5PADDING Base64 인코딩? Base64 Encoding이란 Bina..
-
[컴퓨터구조] CPU의 기본 구조
CPU - 컴퓨터의 핵심 요소 - 기억장치에 저장되어 있는 명령어들을 실행 : "프로그램 수행" CPU의 프로그램 수행 과정 (기능) ① 명령어 인출 (Instruction Fetch) - 무조건 실행 - 기억장치로부터 명령어 읽기 ② 명령어 해독 (Instruction Decode) - 무조건 실행 - 해당 명령어 해독 어떤 동작을 수행해야하는지 결정해야 하기 때문에 ③ 데이터 인출 (Data Fetch) - 명령어를 수행할 때 Data가 필요한 경우, (기억장치, I/O장치)로부터 해당 Data를 읽기 ④ 데이터 처리 (Data Process) - 해당 Data에 대한 산술/논리연산을 수행 ⑤ 데이터 저장 (Data Store) - 수행 결과 저장 → ①, ②는 무조건 실행 / ③, ④, ⑤는 명령어..
-
[컴퓨터구조] 명령어 파이프라이닝
명령어 파이프라이닝 (Instruction Pipelining) - CPU의 성능 ≒ 컴퓨터시스템의 프로그램 처리 시간에 직접적 영향 속도를 향상시키면 향상시킬수록 매우 좋다 속도를 향상시키는 방법 중 하나 : 명령어 파이프라이닝 ≫ 매우 간단하면서 분명한 효과 1. 명령어를 실행하는데 사용되는 하드웨어를 여러 개의 독립적인 단계(stage)들로 분할 2. 각 단계별로 동시에 서로 다른 명령어들을 처리 → CPU 성능 향상 3. 분할되는 단계가 많이질수록 CPU의 성능은 향상 가장 효율적인 파이프라인 조건 - 각 단계별 처리 시간 일정 - 각 명령의 처리 단계 균일 2-단계 명령어 파이프라이닝 - 명령어 사이클은 기본적으로 인출 사이클/실행 사이클 : 2개의 단계로 구성 이 2개의 단계들을 처리하는 하드..
-
[컴퓨터구조론] 2장 기본문제
[2.1] 산술 연산 및 논리 연산을 수행하는 CPU 구성 요소는 어느 것인가? 1. 스택 2. 제어 유니트 3 레지스터 세트 4. ALU CPU 구성요소 - ALU : 산술논리연산 수행 - Register : CPU내에서 Data를 기억하는 Memory 장치 - Control Unit : 명령어 해독 / 그에 따른 제어신호 발생 / 각종 정보들의 전송 통로/방향 지정 [2.2] 다음 중에서 제어 유니트의 기능이 아닌 것은? 1. 명령어 해독 2. 정보의 일시 저장 3. 제어 신호의 발생 4. 각종 정보들의 전송 통로 및 방향 지정 (2) 정보를 일시적으로 저장하는 것은 MBR이다 [2.3] 다음 중에서 명령어 사이클에 속하는 부사이클(subcycle)이 아닌 것은? 1. 인출 사이클 2. 간접 사이클 ..
-
[컴퓨터구조] 시스템의 구성
시스템 버스 (System Bus) - 컴퓨터의 구성요소(CPU, 기억장치, I/O장치)들을 서로 연결하고, Data/신호 교환을 위한 통로 - 한 번에 한 개의 장치만 Data 전송 가능 - 데이터 버스 / 주소 버스 / 제어 버스가 존재한다 데이터 버스 (Data Bus) CPU와 (기억장치, I/O장치) 사이에서 Data를 전달하는 통로 (기억장치, I/O장치)의 명령어와 Data를 CPU로 보낸다 CPU 연산결과를 (기억장치, I/O장치)로 보낸다 - 데이터를 주고 받아야 하기 때문에 양방향 버스 - 데이터 버스 크기(폭) = 한 번에 전송될 수 있는 Data의 크기(비트 수)를 결정 Word 크기, 레지스터 크기와 같다 if 데이터 버스 크기 = 32bit >> Data를 한 번에 32bit씩 ..
-
[컴퓨터구조론] 1장 연습문제
1.1 아래 용어들의 의미를 설명하라 (1) 기계어 프로그램 - 컴퓨터가 이해할 수 있는 0, 1의 2진 비트열로 구성된 프로그램 (2) 어셈블리 명령어 - 각 CPU별 언어 차이를 해결하기 위해, 고급언어 기계어 사이에 각 CPU 고유의 언어 (3) 니모닉스 -각 어셈블러 명령어가 지정하는 동작들을 나타내는 기호 -> LOAD, ADD, STOR,... (4) 단어 - 각 기억장소에 저장되는 Data의 단위 - CPU에 의해 한 번에 처리될 수 있는 비트들의 그룹 1.2 16비트 명령어에서 6비트는 연산 코드로 사용되고, 나머지 비트들은 오퍼랜드로 상용된다 연산 코드 (op code) 오퍼랜드 (operand) 6비트 10비트 (1) CPU가 수행할 수 있는 연산의 종류는 최대 몇 가지 인가? 최대 연..
-
[컴퓨터구조론] 3장 연습문제
[3.1] 다음 수들에 대한 8-bit 길이의 부호화-크기, 1의 보수 및 2의 보수 표현을 각각 구하라 (1) 19 8-bit 부호화-크기 : 0 001 0011 1의 보수 : 0001 0011 2의 보수 : 0001 0011 (2) -19 8-bit 부호화 크기 : 1 001 0011 1의 보수 : 1110 1100 2의 보수 : 1110 1101 (3) 124 8-bit 부호화 크기 : 0 111 1100 1의 보수 : 0111 1100 2의 보수 : 0111 1100 (4) -124 8-bit 부호화 크기 : 1 111 1100 1의 보수 : 1000 0011 2의 보수 : 1000 0100 [3.2] 문제 3.1의 각 결과가 값을 16-bit 길이의 표현으로 확장하라 (1) 19 16-bit 부..