목록전체 글 (94)
Kuma's Curious Paradise
[문제] https://www.acmicpc.net/problem/1931 [회고] 처음에는 소요 시간이 적은 미팅을 먼저 배정해야 한다고 생각. 그러나 회의가 끝나는 시간을 기준으로 정렬해야 하는 문제였음.알고리즘 분류에 ‘그리디 알고리즘’, ‘정렬’이라고 적힌 것을 힌트 삼아 생각할 것.잘한 점은 'input.txt.'를 만들어서 copy&paste 시간을 줄인 것. 💡 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다.100,000은 for문 안에 for문을 쓸 수 없다. + Order(NlogN)은 쓸 수 있다. = Arrays.sort()를 사용할 것.💡 [힌트] (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.힌트를 잘 읽어 보면 ‘회의가 끝나는 시..

[ 문제와 해결 ]1. Filter 테스트 코드를 작성하던 중 문제가 생겼다. 2. 오류 메시지와 원인은 다음과 같다. java.lang.ClassCastException: class java.lang.String cannot be cast to class org.springframework.security.core.userdetails.UserDetails (java.lang.String is in module java.base of loader 'bootstrap'; org.springframework.security.core.userdetails.UserDetails is in unnamed module of loader 'app') - 오류 메시지의 의미는 String은 UserDetails 객..
23. 즉시로딩과 지연로딩은 각각 언제 사용하면 좋을까요?즉시 로딩은 연관된 데이터까지 한 번에 모두 로드하는 방식입니다. 지연 로딩은 필요할 때 연관 데이터를 로드하는 방식이고요. 즉시 로딩은 같이 로드하니까, 초기 로딩 시간이 좀 깁니다. 하지만 연관 데이터가 자주 필요하다면, 즉시 로딩을 쓰는 것이 추가 쿼리를 줄일 수 있겠습니다. 한 번에 로드하고 이후 캐시에 저장해서 쓰는 방법도 있겠습니다. 지연 로딩은 실제로 필요한 메모리만 로드하므로 메모리 사용이 최적화됩니다. 24. Spring을 시작하여 컨테이너가 시작되고 이후 Spring 종료까지의 사이클은 어떻게 되나요? @PostConstruct, @PreDestroy 어노테이션의 역할도 함께 설명해 주세요. 스프링을 실행하면 스프링은 IoC 컨..

Java Persistence API(JPA)는 객체 관계 매핑(ORM)을 사용하여, 자바 코드로 DB에 접근하는 일을 쉽게 만든다. 하지만 JPA를 사용하다 보면 마주하는 문제 중 하나가 바로 'N+1 문제'이다. 1. N+1 문제란?N+1 문제는 1개의 쿼리를 날리는데, 불필요한 N개의 쿼리가 같이 날아가서 성능이 저하되는 문제를 말한다. 이는 주로 컬렉션이나, 연관관계가 맺어진 엔티티를 가져올 때 발생한다. 예를 들어, 멤버가 3명이고 각 멤버는 2개의 주소를 가진다면 '멤버를 모두 찾는 쿼리'(1개)를 날리는데, 연관 엔티티를 가져오기 위해 '각 멤버의 주소를 찾는 쿼리'(멤버의 수만큼 3개)가 추가로 날아가는 것을 말한다. 2. N+1 문제 발생시키기2-1. Member는 여러 개의 Produ..
Member 회원가입 관련 테스트 코드를 작성하였다. 해당 코드를 다시 살펴보며 테스트 코드를 이해해 보자. public class MemberTest { @Nested class create { @Test void 생성성공_주어진_필드로_멤버_생성() { // given String email = "test@naver.com"; String password = "asdf1234!"; String name = "이름"; Address address = Mockito.mock(Address.class); // when Member m..

JUnit과 AssertJ는 모두 단위 테스트 용 라이브러리로, 테스트 작성에 많은 도움을 준다. 다음과 같이 의존성을 추가하면 스프링은 JUnit, AssertJ, Mockito 등 다양한 테스트 라이브러리를 함께 불러온다.testImplementation 'org.springframework.boot:spring-boot-starter-test' 이러한 기본 설정은 두 라이브러리가 모두 필요함을 의미할 것이다. 보통은 AssertJ를 사용해서 테스트 코드를 작성하라는 이야기를 많이 하는데, 이번 기회에 두 라이브러리의 차이점에 대해 알아보려 한다.1. JUnit 위의 스크린샷을 보면, junit 밑에 jupiter.api 라는 것이 존재한다. junit5가 보급되면서 구조가 변경되었고 그 과정에서 ‘..
1. Git Head는 무엇일까?HEAD는 깃에서 작업 중인 브랜치의 ‘최신 커밋’을 가리키는 포인터이다. 따라서…체크아웃을 하면 새 브랜치의 최신 커밋으로 이동한다.HEAD로 알 수 있는 것은 다음과 같다.현재 작업 중인(체크아웃된) 브랜치가 무엇인가?해당 브랜치의 최신 커밋이 무엇인가?HEAD~1은 현재 커밋의 바로 이전 커밋, HEAD~2는 이전이전 커밋을 나타낸다. 즉 최근 커밋들을 탐색할 수 있다.HEAD~1로 이동한 다음 새 커밋을 추가하면, 이 커밋은 어느 브랜치에도 속하지 않게 된다. (detached HEAD 상태라고 부름) 여기서 ‘git checkout -b new-branch-name’로 새 브랜치에 커밋을 넣을 수도 있으며, 그러지 않고 다른 브랜치로 체크아웃해 버린다면 결국 GC..
1. JPA의 데이터 타입은 크게 2가지다.엔티티 타입 (@Entity)값 타입2. 이중 ‘값 타입’은 3가지로 분류된다.기본 값 타입 : int, double 등 자바 원시 타입 + Wrapper class + 특별한 친구 String임베디드 타입 : 엔티티 안에 엔티티! 예를 들면… User 안에 Address 엔티티주소처럼 여러 엔티티에서 공통 사용하는 정보를 임베디드 타입으로 정의하면 코드 중복은 줄이고 재사용성은 높일 수 있다.관련 있는 필드를 묶어 관리하므로 구조가 명확해지고 엔티티들의 관계를 이해하기가 쉬워진다.예시로, Address의 모든 속성들은 User 테이블의 컬럼이 된다. (따로 테이블 안 생김 주의!) + Address가 null이면 해당 컬럼 모두 null이다.정리하자면, 임베디..
14. array와 list, arraylist, linkedlist의 차이에 대해 이야기해 주세요. array는 크기를 조절할 수 없는 정적배열을 말합니다. list의 구현체인 arraylist와 linkedlist는 크기 조정이 가능한 동적 배열이고요. array는 메모리 상에 붙어서, 일렬로 저장이 되는데 초기화할 때 크기를 지정한 만큼 생성됩니다. list의 경우 인터페이스로, 순서를 보장하는 배열 기반 자료구조를 이야기합니다. arraylist와 linkedlist가 그 구현체 중 하나인데, arraylist는 array와 마찬가지로 일렬 저장이 됩니다. 일단 첫 번째 만들 때 크기 10을 할당하기 때문에 배열이 늘거나 줄어도 괜찮습니다. 만약 10을 넘어가면 크기 20을 재할당하고, 이후 40..
8. javac와 JIT 컴파일러의 차이를 설명해 주세요. 이 둘은 모두 컴파일러지만 작동되는 시간과 하는 일에 차이가 있습니다. 자바 컴파일러의 경우, 자바 소스를 바이트 코드로 읽어내 클래스 파일에 저장합니다. 이후 JVM은 자바 인터프리터와 JIT 컴파일러를 이용해 바이트 코드를 기계 코드로 읽어내 실행시키는데, 이때 JIT 컴파일러는 자주 쓰이는 부분을 미리 번역하여 성능 향상을 높입니다. 클래스 파일을 한 줄씩 실행시키는 작업은 자바 인터프리터가 합니다. 9. 오버라이딩과 오버로딩을, 동적바인딩과 정적바인딩과 관련지어 설명해 주세요. 오버라이딩은 프로그램 실행 도중에, 오버로딩은 컴파일 타임 때 어떤 메서드를 호출할 지 결정한다는 점에서 각각 동적 바인딩과 정적 바인딩과 관련이 있습니다. 예를..