├── README.md └── java └── spring └── README.md /README.md: -------------------------------------------------------------------------------- 1 | # code-review 2 | 3 | 이 문서는 Code Review 하다가 아쉬웠던 점이나 제가 받았던 면접 질문들을 적어두는 페이지 입니다. 4 | 문서에 잘못된 내용이나 추가할 내용이 있다면 issue 를 만들어서 알려주시면 감사하겠습니다. 5 | 6 | ---- 7 | 8 | ## Spring Boot & JPA 9 | 10 | - [체크 리스트 겸 학습](./java/spring/README.md) 11 | 12 | ---- 13 | 14 | # 주의 15 | 16 | - **본 문서의 무단 복제를 금합니다.** 17 | - fork 로 저장소를 가져가서 따로 체크를 해보시거나 사용하셔도 됩니다. 18 | - 틀린 내용이 있을 수도 있습니다. -------------------------------------------------------------------------------- /java/spring/README.md: -------------------------------------------------------------------------------- 1 | # Basic 2 | 3 | ## Log 4 | - [ ] 로그 메세지만 보고 어떤 사유로 일이 진행되었거나, 예외가 발생했는지 알수 있는가? 5 | - [ ] 개발자 말고 다른 사람도 행위를 추측할 수 있는 메세지인가? 6 | - [ ] 로그를 파일 시스템으로 저장할 수 있게 만들었는가? 7 | - [ ] 저장할 수 있도록 만들었다면 저장 용량이 넘쳤을때 계획 혹은 몇일 단위로 보관할것인지 보관 정책은 수립했는가? 8 | - [ ] 로그 메세지를 쉽게 보기 위한 모니터링 툴을 만들었는가? 9 | - [ ] 만들었다면 현재 예외가 발생했을때 검색하기 쉬운 구조인가? 10 | 11 | # Spring Boot 12 | 13 | - [ ] `@Configuration` 의 역할을 알고 있는가? 14 | - [ ] 어떨때 사용하면 좋다고 생각하는가? 15 | - [ ] `@PropertySource` 를 아는가? 16 | - [ ] 어떨때 사용하면 좋다고 생각하는가? 17 | 18 | - [ ] `@AutoWired` 를 아는가? 19 | - [ ] 다양한 `Injection` 방법에 대해서 아는가? 20 | - [ ] `Contructor Injection` 의 문제는 무엇인가? 21 | - [ ] 그럼에도 왜 `Constructor Injection` 을 사용하라고 권장하는가? 22 | - [ ] 만약 변경에 취약하다고 답변했다면 왜 취약한가? 둘다 Interface 나 Type 으로 똑같이 주입받을 수 있는데? 23 | - [ ] Spring 을 사용하는 상황이 아니라 단순 Java 였으면 어떻게 짰을거 같은가? 24 | - [ ] `Setter Injection` 의 문제는 무엇인가? 25 | - [ ] `Field Injection` 의 문제는 무엇인가? 26 | 27 | - [ ] `@Bean` 을 알고 있는가? 28 | - [ ] `@Bean` 이 어떻게 만들어지는지 아는가? 29 | - [ ] `@Bean` 이 어떻게 저장되어 있는지 아는가? (간단하게라도) 30 | - [ ] 어떤 방법으로 Bean 을 만들 수 있는지 아는가? 31 | - [ ] Bean 을 직접 꺼낼 수 있는 방법을 아는가? 32 | - [ ] ApplicationContext 를 아는가? 33 | - [ ] BeanFactory 를 아는가? 34 | - [ ] 동일한 타입의 Bean 이 여럿 존재할때 그 Type 의 Bean 을 주입받으려고 하면 어떤 일이 발생하는가? 35 | - [ ] 만약 특정 Bean 을 주입받으려고 하면 어떻게 되는가? 36 | 37 | - [ ] `AOP` 를 알고 있는가? 38 | - [ ] 횡단 관심사란 무엇인지 아는가? 39 | - [ ] 어떻게 `AOP` 가 만들어지는지 아는가? 40 | - [ ] CGLIB, Dynaimc Proxy 를 아는가? 41 | - [ ] 안다면 어떤 차이가 있는지 아는가? 42 | 43 | 44 | - [ ] `@Async` 를 아는가? 45 | - [ ] 내부적으로 어떻게 구현되어 있는지 아는가? 46 | - [ ] `@Async` 를 사용할때 Thread 적인 부분을 생각해본적이 있는가? 47 | 48 | - [ ] Profle 을 아는가? 49 | - [ ] 개발환경에따라서 Property 를 다르게 주입받고 있는가? 50 | - [ ] `@ConditionalOnProperty` 를 아는가? 51 | - [ ] 운영환경에서 장애 현상이 발생할수 있는 옵션을 잘 분리하였는가? 52 | 53 | - [ ] `@SpringBootApplication` 에 어떤 Bean 들이 붙어 있는지 아는가? 54 | - [ ] 만약 수동으로 Bean 들을 등록해야 한다면 어떻게 등록해야 하는지 아는가? 55 | - [ ] `@Import` 는 아는가? 56 | - [ ] `@ComponentScane` 을 아는가? 57 | - [ ] `@EnableAutoConfiguration` 이 어떤 역할을 하는지 아는가? 58 | 59 | # JPA 60 | 61 | - [ ] 자신의 쿼리가 나가는 것을 확인하는가? 62 | 63 | - [ ] Entity LifeCycle 에 대해서 알고 있는가? 64 | 65 | - [ ] JPA 변경감지의 원리에 대해서 알고 있는가? 66 | - [ ] 만약 EqualsAndHashCode 를 사용했다면 변경감지에 대한 부분을 생각했는가? 67 | - [ ] 어떤 상황에 동작하는가? 68 | - [ ] 아래 상황에서 어떤 쿼리가 발생하는지 아는가? 69 | ```java 70 | @Entity 71 | class Person { 72 | 73 | @Id 74 | Long id; 75 | 76 | @Column 77 | String name; 78 | 79 | } 80 | 81 | @Service 82 | class Service { 83 | 84 | private final PersonRepository personRepository; 85 | 86 | @Transactional 87 | public void test() { 88 | Person person = personRepository.findById(1L); 89 | 90 | person.setName("roach!!") 91 | } 92 | 93 | } 94 | ``` 95 | - [ ] 그럼 아래 상황에서는 어떤 쿼리가 발생하는지 아는가? 96 | ```java 97 | @Entity 98 | class Person { 99 | 100 | @Id 101 | Long id; 102 | 103 | @Column 104 | String name; 105 | 106 | } 107 | 108 | @Service 109 | class Service { 110 | 111 | private final PersonRepository personRepository; 112 | 113 | @Transactional 114 | public void test() { 115 | Person person = personRepository.findByName("roachBot"); 116 | 117 | person.setName("roach!!") 118 | } 119 | 120 | } 121 | ``` 122 | - [ ] 어떤 차이가 있는가? 아님 없는가? 123 | 124 | - [ ] `@Transactional` 어노테이션을 알고 있는가? 125 | - [ ] 읽기만 하는 부분에서 `readOnly` 옵션을 주고 있는가? 126 | - [ ] readOnly 옵션을 넣었을때 어떻게 다른지 아는가? 127 | - [ ] flush 가 안된다고 답변했다면 flush 는 무엇인지 아는가? 128 | - [ ] flushMode 에 대해서 아는가? 129 | - [ ] DB 의 트랜잭션을 아는가? 130 | - [ ] `@Transactional` 어노테이션에 리스크는 없어 보이나? 131 | - [ ] TrnsactionTemplate 을 아는가? 132 | 133 | - [ ] 트랜잭션 propagation 옵션 에 대해서 아는가? 134 | - [ ] 옵션들을 실제로 사용해본 상황이 있는가? 135 | 136 | - [ ] 동일 class 내에서 `@Transactional` 어노테이션이 작동하는가? 작동하지 않는 다면 이유를 아는가? 137 | - [ ] 만약 작동하지 않는다면 작동시킬 수 있는 방법이 있는가? 138 | - [ ] 작동시켰다면 그것이 Constructor Injection 일때의 문제는 없는가? 139 | - [ ] private method 에 `@Transactional` 을 붙이면 작동할까? 140 | - [ ] 왜 작동하지 않는지 이유를 아는가? 141 | 142 | - [ ] 쓰기 지연 저장소에 대해서 아는가? 143 | - [ ] 어떤 쿼리들이 쓰기 지연 저장소에 저장되는지 아는가? 144 | - [ ] 어느시점에 쓰기 지연 저장소에 있는 쿼리가 쏘아지는지 아는가? 145 | 146 | - [ ] 쓰기지연저장소 구현체를 본적있는가? 147 | - [ ] 어떻게 쓰기 지연 저장소에 쿼리들이 저장되는지 구조를 아는가? 148 | 149 | - [ ] Persistence Context 에 대해 알고 있는가? 150 | - [ ] 1차 캐시 2차 캐시를 알고 있는가? 151 | - [ ] 그렇다면 아래 상황에서 쿼리가 어떻게 발생할 것 같은가? 152 | ```java 153 | @Entity 154 | class Person { 155 | 156 | @Id 157 | Long id; 158 | 159 | @Column 160 | String name; 161 | 162 | } 163 | 164 | @Service 165 | class Service { 166 | 167 | private final PersonRepository personRepository; 168 | 169 | @Transactional 170 | public void test() { 171 | Person person = personRepository.findByName("roach"); 172 | 173 | Person person2 = personRepository.findByName("roach"); 174 | } 175 | 176 | } 177 | ``` 178 | - [ ] 1차 캐시, 2차 캐시의 Scope 를 설명해 달라. 179 | - [ ] 각 구현체를 본적이 있는가? 동작원리를 아는가? 180 | 181 | - [ ] Paging 을 알고 있는가? 182 | - [ ] Paging Query 가 생성해주는 쿼리가 최적화된 쿼리라고 생각하는가? 183 | - [ ] 아니라면 어떻게 최적화 할 수 있는지 아는가? 184 | - [ ] offset 방식 (무한스크롤 또는 더보기) 방식에 대해서 알고 있는가? 185 | - [ ] 이를 구현하는 방법을 아는가? 186 | 187 | - [ ] OSIV 옵션을 아는가? 188 | - [ ] 반드시 꺼야 한다고 생각하는지 / 아니면 반드시켜야 한다고 생각하나. 189 | - [ ] 반드시 켜야 한다면 이유는 무엇인가? 190 | - [ ] 그게 아키텍쳐 적으로 옳은가? 191 | - [ ] 반드시 꺼야 한다면 이유는 무엇인가? 192 | 193 | - [ ] JVM 을 공부해본적이 있는가? 194 | - [ ] Select 로 대량의 엔티티를 조회해와도 메모리에 문제가 없나? 195 | - [ ] 이를 막을 방법을 아는가? 196 | - [ ] 페이징이라면 읽어왔던 것 들이 바로 메모리에서 GC 가 된다고 생각하는가? 197 | --------------------------------------------------------------------------------