분류 전체보기

· 오류해결
우선 테스트하려고 하는 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..
· JAVA
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 = ..
· 기타
기존 프로젝트에서도 JWT랑 시큐리티, Oauth를 사용했지만 이번에는 jwt 저장 방법을 변경해보려고 한다. 기존 방법 액세스 토큰 -> json으로 넘겨서 클라이언트가 로컬, 세션 스토리지에 저장해서 관리. 리프레시 토큰 -> 쿠키에 저장해서 secure, httpOnly, sameSite 옵션을 걸음. 리프레시 토큰은 쿠키에 저장해서 보안성을 챙겼지만 액세스 토큰을 스토리지에 저장한다는 게 마음에 걸렸다. 그래서 액세스 토큰도 쿠키에 같이 저장하기로 하였다. 변경 방법 아래 설명은 스프링부트 Oauth 라이브러를 사용해서 successHandler까지 도달했다는 가정 하에 진행한다.(즉 인증코드를 액세스 토큰으로 바꿔서 접근 권한을 획득한 상태) @Override @Transactional publ..
indeep
'분류 전체보기' 카테고리의 글 목록 (11 Page)