JPAQueryFactory 사용 Repository에서 JPAQueryFactory를 사용하는 방법은 두가지 있다 Repository에서 직접 EntityManager를 주입 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } } JPAQueryFactory 스프링 빈 등록 @Bean JPAQueryFactory jpaQueryFactory(Ent..
벌크 연산이란 쿼리 한번으로 대량의 데이터를 수정하는 것을 말한다 JPQL에서도 지원하여, querydsl도 벌크 연산에 대해 지원한다 수정 벌크 연산 @Test @DisplayName("수정 벌크 연산") void bulkUpdate() throws Exception { long count = queryFactory //영향을 받은 row 수 .update(member) .set(member.username, "비회원") .where(member.age.lt(20)) .execute(); em.flush(); em.clear(); print(); } em.flush(), em.clear()를 해주지 않으면 원하는 결과가 나오지 않게 된다 간단하게 말하면 벌크 연산은 영속성 컨텍스트를 통하지 않고 디비에..
프로젝션? 데이터베이스에서 프로젝션은 조건에 맞는 릴레이션의 속성을 추출한다는 의미이다 따라서 우리는 원하는 속성을 추출하여 얻을 수 있다 만약에 프로젝션 대상이 한개라면 타입을 "명확"하게 정의할 수 있다 하지만 둘 이상이라면 "튜플"이나 "DTO"를 사용해야한다 순수 JPA에서의 DTO 조회 List result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username, m.age) " + "from Member m", MemberDto.class) .getResultList(); 순수 JPA에서 DTO를 조회하기 위해서는 new 명령어를 이용하여 패키지 구조를 다 적어줘야함 또한, 생성자 방식만 지원함 위와 같은 이유로(내 생각엔 패..
디스크를 보조저장장치로 사용하는 이유 추가 장소를 사용하지 않고 재기록 가능 직접 접근할 수 있기 때문에 파일을 순차적 또는 무작위 방법으로 쉽게 접근할 수 있음 파일? 이름 있는 연관된 정보들의 컬렉션 OS는 다양한 저장 장치를 “file”이라는 동일한 논리적 단위로 볼 수 있게 함 파일 시스템? 데이터를 쉽게 store, located, retrieved할 수 있어서 저장장치를 더욱 효율적이고 편리하게 사용할 수 있게 한다 운영체제에서 파일을 관리하는 부분 파일, 파일 메타 데이터, 디렉토리 정보 등을 관리 디렉토리(directory)? 파일의 메타데이터 중 일부를 보관하고 있는 특별한 파일 디렉토리에 속한 파일 이름 및 파일의 메타데이터 Partition(=Logical Disk)? 하나의 물리적 ..
Swagger란? API 문서 자동화 open api api path, request, response 값 및 제약 조건 등을 문서화 파라미터를 넣어서 실제로 어떤 응답이 오는지 테스트 가능 Version spring boot 2.6.7 swagger 3.0 gradle 7.4.1 의존성 추가 implementation 'io.springfox:springfox-boot-starter:3.0.0' 기존 swagger 2.x 에서는 springfox-swagger-ui를 포함해줘야했다 하지만 3.x 부터는 stater에 해당 liberary가 모두 포함되어있다 Config 설정 @Configuration public class SwaggerConfig extends WebMvcConfigurationSup..
산술 연산자(Arithmetic Operators) 간단한 수학 연산을 하기 위해 사용하는 연산자 기본 숫자 및 그에 대응하는 boxed type에서만 작동 +, -, *, /, %가 존재한다 '/'는 몫, '%'는 나머지를 의미한다 @Test @DisplayName("산술 연산") void op() throws Exception{ int a = 6; int b = 4; System.out.println("a/b = " + a / b); //몫 System.out.println("a%b = " + a % b); //나머지 } 비트 연산자(Bitwise Operators) 비트 연산자에는 Bitwise Logical Operators, Bitwise Shift Operators로 나눌 수 있다 Bitwis..
Primitive Type의 종류와 범위 그리고 기본 값은 무엇인가요? 타입 size 최대 최소 기본값 boolean 1 X X false byte 16 -2^7 2^7 0 char 16 0 2^16-1 \u0000 short 16 -2^15 2^15-1 0 int 32 -2^31 2^31-1 0 long 64 -2^63 2^63-1 0 float 32 -2^-149 (2-2^-23)*2^127 0.0 double 64 -2^-1074 (2-2-52)*2^1023 0.0 static 변수는 값을 초기화하지 않으면 기본값으로 초기화가 되므로 테스트를 작성할 때 static 변수로 선언한 뒤 기본값을 출력했다 char의 기본값이 무엇을 나타내는지 몰라 찾아보니 인텔리제이에선 \u0000을 저렇게 나타낸다 p..
Spring에서 DI를 하는 방법에는 필드 주입, 생성자 주입, Setter 주입이 있다 intellij에서 필드 주입을 사용하면 “Field injection is not recommended” 요런 문구를 볼 수 있다 왜 필드 주입은 추천하지 않는 것일까? 왜 생성자 주입을 선호하는 것일까? 필드 주입의 단점 final 키워드를 붙일 수 없음 final은 선언 시 초기화를 해줘야하기 때문에 컴파일 에러 발생 따라서 immutable을 보장할 수 없음 @Autowired private final QuestionRepository questionRepository; //compile error spring 컨테이너 외부에서 사용할 수 없음 == spring에 종속적 순수 자바 코드(@SpringBootT..
기본 조인 List result1 = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); 세타 조인 theta join을 이용해서 연관관계가 없는 필드도 조인을 할 수 있다 sql을 보면 cross가 있는데, "카테시안 곱"을 통하여 모든 엔티티를 조인한 다음, where 조건에 맞는 스키마를 찾는다 그래서 팀 2개, 멤버가 7개 이므로 카테시안 곱의 결과는 총 14개임을 알 수 있다 member, team 테이블 카테시안 곱 결과 결과 on 절 ON 절을 사용하여 "조인 대상 필터링"과 "연관관계가 없는 필드로 외부 조인"할 수 있다 조인 대상 필터링 일반적으로 JPQL에서 조인을..
JPQL & Querydsl JPQL @Test @DisplayName("jpql 사용") void startJPQL() throws Exception { Member findMember = em.createQuery("select m from Member m " + "where m.username=:username", Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).isEqualTo("member1"); } Querydsl @Test @DisplayName("querydsl 사용") void startQuerydsl() throws Exception{ JPAQ..
자바에서 동기화와 관련된 keyword에는 synchronized와 volatile이 있다 이번에는 volatile에 대해 공부해보자 synchronized와 volatile의 차이는 뭔가요? synchronized 상호 배제와 가시성을 모두 보장 코드 block과 메서드에서 사용 가능 스레드 메모리와 메인 메모리 사이의 "모든" 변수 값을 동기화 volatile보다 overhead 크다 null 객체는 동기화 X(링크) null 객체를 동기화하고, 다른 곳에서 해당 객체를 사용하게 된다면 NPE발생 lock을 obtain하고 release 한다(이유는 아래에서) volatile "atomic"이 아닌 가시성만을 보장 필드에서만 사용 가능 스레드 메모리와 메인 메모리 사이의 volatile 변수 값을 동..
에러 발단 RestController에서 Answer를 반환하여 HttpMessageConverter가 JSON 형태로 변환시는 와중에 Answer와 Question의양방향 연관관계로 인해 "순환참조"가 발생했다. 그래서 굳이 필요하지 않은 answers에 @JsonIgnore를 붙여주었다 이제 순환참조는 해결됐다. 그러나 삭제하는 과정에서 Answer 객체를 반환할 때, 아래와 같은 에러가 발생했다 에러 전문 2022-04-17 01:21:29.446 ERROR 67772 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with pa..