우선 테스트하려고 하는 2개의 클래스이다. Scrum @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @Column(nullable = false) private String name; @CreatedDate @Column(nullable = false) private LocalDateTime createdDate; @Colum..
JPA로 테이블을 설계하면서 우선 지킬 것이 몇 가지 있었다. 1. 일단 LAZY로 선언 EAGER로 선언하면 연관 관계에 있는 Entity까지 전부 쿼리를 날려서 조회하기 때문에 쓰이지 않는 경우에 너무 자원 소모가 심하다고 생각했다. 그래서 프록시 객체로 조회하도록 LAZY를 우선으로 사용했다. 2. 연관 관계를 사용해야 할 경우 FETCH JOIN을 사용해서 하나의 쿼리로 처리하기. 결국 LAZY를 사용해도 해당 객체에 접근하게 될 경우 쿼리를 날려서 가져오게 되면서 N+1 문제가 발생한다. 이를 방지하기 위해 FETCH JOIN을 사용해서 하나의 쿼리로 연관 관계에 있는 객체를 가져오도록 만들었다. 그러다가 문득 FETCH JOIN을 안쓰면 진짜 쿼리가 N+1로 날라가는지 궁금해서 테스트를 해봤다..
현재 프로젝트를 진행하면서 http://localhost:8080으로 요청을 보내면 시큐리티의 oauth2Login()이 동작하는 기상천외한 문제가 발생했다. // 모든 요청 허용 .authorizeHttpRequests(authorize -> { // 모든 api로 시작하는 요청은 인증 필요 authorize.requestMatchers("/oauth2/authorization/", "/swagger-ui/**", "/api-docs", "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html").permitAll(); authorize.anyRequest().authenticated(); }) .addFilterBefore(jwtFilter, UsernamePas..
TDD에 대해 공부하다가 Record로 이너 클래스를 만드는 경우를 볼 수 있었다. Record는 자바 14에 새로 도입되었고 자바 16에서 정식 채택된 새로운 유형의 클래스다.불변 객체를 쉽게 생성하고 다룰 수 있다는 특징이 있다. 밑에는 Record를 사용하지 않고 기존에 Java로 불변 객체를 만드는 Class다.import java.util.Objects;public final class Car { private final String name; private final int price; // 생성자 public Car(String name, int price) { this.name = name; this.price = price; } ..
AOP에 대해서 설명해주세요. AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍을 의미한다. 우리는 여태까지 객체 지향 프로그래밍을 해왔을 것이다. 객체 지향은 책임과 관심사에 따라 클래스를 구분했다. 그래서 객체 지향으로 설계를 하면 응집도는 높아지고 결합도는 낮아지게 됐다. 그런데 각 클래스마다 공통된 기능들을 똑같이 가지게 되는 경우가 생기게 된다. 위 사진에서는 클래스 A, B, C가 각각 Logging, Security, Transaction을 전부 가지고 있다.(이 얼마나 비효휼적인가) 관점 지향 프로그래밍은 이렇게 독립적으로 분리하기 어려운 부가 기능들을 모듈화 시키는 방식을 칭한다. 사진처럼 공통으로 가지는 관심사를 횡단 관심사(Cross cutting co..
직렬화가 무엇인지 설명해주세요. 그렇다면 직렬화 컬렉션에는 뭐가 있죠? 프로젝트에서 직렬화를 적용해본 경험이 어떤 것이 있나요? 진짜 뼈맞은 질문이었다. 내가 아는 직렬화는 "서버와 브라우저는 바이트 스트림으로 데이터를 주고 받는데 객체를 네트워크로 전송하기 위해 바이트 스트림으로 변환시키는 작업을 직렬화라고 합니다" 라고 대답했었다. 이 대답이 틀린 말은 아니다. 근데 나는 직렬화라는 개념이랑 JSON이라는 개념에서 충돌이 일어났었다. 직렬화 직렬화(Serialize)는 자바에서 사용되는 Object나 Data를 다른 자바 시스템에서도 사용이 가능하도록 바이트 스트림 형태로 변환시키는 기술을 말한다. 반대로 바이트 스트림 형태의 데이터를 자바 시스템에서 사용하도록 Object나 Data로 변환하는 기술..
String a = "abc" 라고 만든 변수가 있고, String b = new String("abc") 라고 만든 변수가 있습니다. 이 두 개를 '==' 으로 비교하게 되면 false가 나오는데 왜 그런 건가요? 되게 간단한 질문이라고 생각한다. 기본적으로 String에서 == 비교와 equals()로 비교를 했을 때 차이점을 알고 있냐는 질문과 유사하다. 우선 자바 메모리 구조가 어떻게 되는지 사진으로 알아보자. String a = "abc"; 리터럴로 a라는 변수에 값을 할당했다. 이렇게 하면 스트링 풀에 "abc"라는 값이 생성되기 된다. 새로운 그 다음 새로운 값을 만들어서 비교해보면 String a = "a"; System.out.println(a.hashCode()); String c = ..
프로젝트를 진행하면서 유저 로그인을 진행하는데 406 에러가 발생하는 상황이 있었다. 스프링부트와 리액트를 사용했고 내부 서비스는 전부 동작해서 DB에 값 수정까지 됐지만응답을 하는 과정에서 406 에러가 발생했다. 나는 ApiResponse를 따로 만들어서 json 응답을 생성하였다. package com.parkchoi.scrum.util.api;public class ApiResponse { // 상태 구분1 private static final String SUCCESS_STATUS = "success"; private static final String FAIL_STATUS = "fail"; private static final String ERROR_STATUS = "er..