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의 사상 함수는 어떻게 변경되어..
-
[명품 Java] 11장 연습문제 (기본적인 스윙 컴포넌트와 활용)
[11장 1번] 다음 중 스윙 컴포넌트가 가진 정보가 아닌 것은? 1. 컴포넌트 자신의 위치 2. 컴포넌트 자신의 배경색 3. 컴포넌트가 만들어진 시간 4. 컴포넌트의 부모 컨테이너 [11장 2번] JLabel은 어떤 목적으로 사용하는가? 1. 이미지나 텍스트 출력 2. 이미지만 출력 3. 이미지, 텍스트, 버튼 출력 4. 텍스트만 출력 [11장 3번] "java.jpg"를 가진 JLabel 컴포넌트를 생성하는 간단한 코드이다. 빈칸을 채워라 ___________ icon = new ___________("java.jpg"); JLabel label = new JLabel(); label.___________(icon); >> 풀이 ImageIcon icon = new ImageIcon("java.jpg..
-
[명품 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..
-
[명품 Java] 7장 연습문제 (제네릭과 컬렉션)
[7장 1번] 컬렉션에 관한 설명으로 틀린 것은? 1. 가변 크기라서 배열보다 사용하기 편리하다. 2. 삽입 삭제 시 원소의 위치를 컬렉션이 자동 조절하므로 편하다. 3. 객체들만 삽입되므로 int와 같은 기본 타입의 값을 저장하는 방법이 없어 아쉽다. 4. 컬렉션은 모두 제네릭(generics)으로 만들어져 있다. - 3번, int와 같은 기본 타입의 값은 Wrapper 클래스를 이용해서 객체로 만들어서 저장하면 된다 [7장 2번] 다음 빈칸에 적절한 단어를 기입하라. 클래스, 인터페이스, 메소드를 특정 타입에 종속되지 않게 일반화 시켜 작성하는 기술을 제네릭이라 한다. Vector에서 E는 제네릭 타입 혹은 타입 매개변수라고 부 른다. E에 Integer 등과 같이 객체 타입을 지정하여 특정 타입의 ..
-
[컴퓨터구조] 제어 유니트
제어 유니트 (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] 9장 연습문제 (자바 GUI 기초 / AWT와 스윙)
[9장 1번] 자바에서는 AWT 컴포넌트와 스윙 컴포넌트를 제공한다. 이들 중 어떤 것이 경량 컴포넌트이고, 어떤 것이 중량 컴포넌트인가? 그리고 차이점은? - awt 컴포넌트가 중량 컴포넌트이고, swing 컴포넌트가 경량 컴포넌트이다. - awt는 해당 운영체제의 gui를 빌려 쓰는거라서 운영체제에 따라 배치나 모양이 다르고 속도가 빠르다. 하지만 운영체제에 따라 버그가 발생한다 - swing은 운영체제의 자원을 빌리지 않고, 직접 화면에 그려서 운영체제간에 버그를 해결한다. 자바언어로만 구성되어 있고 속도가 느리다 [9장 2번] 데스크톱에서 실행되는 GUI 응용프로그램 작성 시 AWT보다 스윙 사용을 권장하는 이유는? - swing은 운영체제와 관계없이 항상 동일하게 작동하고, 동일한 모양으로 나타..
-
[컴퓨터구조] 명령어 파이프라이닝
명령어 파이프라이닝 (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) - 수행 결과 저장 → ①, ②는 무조건 실행 / ③, ④, ⑤는 명령어..