🦵🏼발단우테코에 오기 전, 팀 프로젝트를 하면서 JPQL의 new 키워드를 통해 생성한 DTO를 받은 적이 있었다.그러고 난후 코드리뷰에서 다른 팀원이 비용이 비싸기 때문에 DB단에서 연산을 지양하는 것이 좋을 것 같다는 식의 피드백을 주었는데, 당시에 new 키워드의 실행 시점이 어느 시점인지 파악해보거나 깊게 생각해보지 않고 코드를 변경했었다. 우테코에 오고 난후, 미션을 진행하면서 JPQL로 new 키워드를 사용한 예제 코드가 있었는데 당시의 경험이 기억나면서 정말 지양해야 할지 장단점이 무엇일지 파악하고자 글을 작성하게 되었다. 🤔 의문new 키워드가 정말 DB단에서 연산이 맞을까?new 키워드, 더 나아가 JPQL은 어떻게 동작할까?아니라면, 지양해야 하는 다른 이유가 있을까?최종적으로 n..
이번 방탈출 사용자 예약에서 아래와 같은 예제 코드가 있었는데, 무지성으로 복붙하고 나서 보니 @Bean에 대해 궁금함이 생겼다. 이 기회에 @Bean, @Component의 차이가 무엇인지에 대해 정리하고 어떤 경우에 사용하면 좋을지에 대해 이야기 해보고자 한다.Spring Bean이란스프링 부트에서 Bean은 Spring Container가 관리하는 객체들을 말한다.따라서 내가 사용하고자 하는 객체를 Spring DI를 통해 사용하기 위해서는 객체를 Bean으로 등록하는 과정이 필요하다.Spring Boot에서의 Bean 등록 방법spring boot에서는 Bean을 등록할 수 있는 방법을 두가지를 제공한다.spring은 xml 등의 방식도 제공하는 것 같으나 아직은 패스한다.1. @Component..
기존 프로젝트를 할 때, 스프링과 비슷하게 "객체지향" 에 대해서도 깊은 고민 없이 자바를 사용했었다.돌아보면 도메인 객체를 사용하지 않고 그저 영속성 entity를 가지고 개발을 했던 것 같다. 이번 9단계 요구사항을 반영하기 위해 코드를 볼아보면서, 기껏 열심히 레벨 1동안 배운 내용들을 써먹지 못하고 옛 프로젝트를 할 때처럼 사용한 것 같아서 아쉬웠다. 따라서 이 프로젝트에서의 엔티티 객체들을 어떻게 바라보아야 할까 고민하다가 혼란이 와버렸다.public class Reservation { private final Long id; private final String name; private final ReservationDate reservationDate; private f..
템플릿 엔진스프링 부트는 정적 페이지와 템플릿 시작 페이지를 모두 지원한다.먼저, static 아래의 index.html 파일을 찾고 없다면 index 템플릿을 찾는다. 아래와 같은 위치로 파일이 존재한다면, /static/index.html을 찾고, (/static/index.html)이 없다면, /templates/index.html를 찾아 응용 프로그램 시작 페이지로 띄운다.static에는 보통 정적 파일인 js나 css 같은 파일들이 위치하고, templates에는 서버가 실행되면서 동적으로 렌더링되는 Thymeleaf 템플릿 파일들이 위치한다.템플릿 엔진 반환하기@Controllerpublic class MemberController { @GetMapping("/hello") publ..
이번주 미션을 하면서 뭔가 느끼는 게 많았다. 크루들과 의견 공유 시에, 문제에 대해 고민하는 것과 함께 어떻게 하면 "내 의견을 내 의도대로 전달할 수 있을지", "반대 의견을 설득할 수 있는 근거가 있는지" 등에 대한 연습이 필요하다고 느꼈다. 아무리 좋은 의견이 있어도 잘못 전달되면 의미가 없다... 개인적으로 레벨1동안 끝없이 토론하고 이를 지켜보기도 하면서 느낀 것이, 토론이 길어지는 이유는 결국 서로를 설득하지 못하는 것이라고 생각한다. 내 의견만 주장하기 보다는 내가 상대방을 설득시킬만한 근거를 제공했는지 돌이켜보자.Keep[리뷰 반영] 리뷰어가 납득할 수 있는 근거를 찾으려고 고민한 점[리뷰 반영] 중요하다고 생각하지 않는 점은 과감히 넘긴 점[리뷰 반영] 리뷰 반영을 하면서 깊게 파고드는..
미션 예제 코드에 @DirtiesContext라는 어노테이션을 사용하던 중 정확하게 어떤 어노테이션인지 알고자 정리한다. 기본적으로, 스프링 테스트에서는 ApplicationContext를 캐싱하여, 기존의 Context를 재활용한다.따라서 DB 작업이 수행된 테스트가 존재할 때, 테스트 간에 격리가 되지 않고 테스트 간에 영향을 받게 될 수도 있는 것이다.이럴 때 사용할 수 있는 것이 바로 @DirtiesContext 어노테이션이다. @DirtiesContext 너는 누구냐@DirtiesContext는 테스트 실행 중, Spring ApplicationContext가 Dirty 상태가 된다면 컨텍스트를 닫아버리는 것을 말한다.즉, 애플리케이션 컨텍스트가 더티로 표시되면 테스트 프레임워크의 캐시에서 제거..
Keep[기존 회고 반영] 레벨 1의 액션 플랜을 지키고자 1주차 회고를 작성한 점[페어 프로그래밍] 학습 테스트에 충분한 시간을 투자한 점[페어 프로그래밍] 모르는 부분이나 애매한 개념들에 대해 짚고 넘어간 점[리뷰 제출] 미리 참고할 부분을 코멘트로 작성하여, 불필요한 리뷰 사이클을 줄인 점[리뷰 제출] 레벨1의 코드 리뷰를 통해 배웠던 마인드셋을 적용하려고 한 점현구막의 리뷰를 통해 동료 개발자의 관점으로 보고자 하는 것을 이번 리뷰에도 적용[미션 전체] 기존에 사용법만 익혔던 어노테이션이나 원리 등에 대해 깊게 고민하려고 한 점Problem[페어 프로그래밍] 페어와 함께 중요하지 않는 것에 매몰되었다.레벨1을 통해 다른 페어들과 개발을 하면서 작은 것이라도 넘어가지 않는 태도(?)에 익숙해졌는데,..
난 레벨 1 동안 어떤 경험들을 했을까?1. 객체지향에 입문하다.우테코 내에서, 그리고 여러 글을 통해 “부끄지만 2년 넘게 자바를 사용하면서도 객체지향에 대해 깊게 고민해본적이 없다”는 말을 했었다.레벨1 동안 가장 많이 성장한 점은 객체지향을 바라보는 태도의 변화이다.그동안은 객체를 그냥 ”클래스의 인스턴스 그뿐”이라고만 생각했었고, 객체지향은 “자바의 패러다임”이라는 이론적인 단어로만 생각했었다.4번의 페어프로그래밍을 진행하고, 객사오를 읽으면서 객체가 무엇이며, 객체지향을 위해 어떻게 바라봐야 하는지에 대한 나만의 기준을 세워나가고 있다. 사실 레벨 1의 마지막 체스 미션을 하면서 한번 크게 위기가 왔었다. 미션을 진행하면서 부정적인 생각들만 떠올랐기 때문이다.“웹 개발을 할 때 객체지향이 직접적..
1단계 방탈출 예약 관리 미션의 제공된 테스트 코드를 보면,클래스단에 @SpringBootTest가 붙여져 있고 RestAssured 라이브러리를 통해 테스트 코드를 작성하고 있습니다. 오늘은 테스트 포트를 변경하려다 삽질을 해본 이야기에 대해 작성해보겠습니다.👀 @SpringBootTest란Spring Boot에서 Spring Boot 기능이 필요할 때 표준 스프링 테스트 @ContextConfiguration 어노테이션의 대안으로 사용할 수 있는 어노테이션입니다.이 어노테이션은 Spring을 통해 테스트에 사용되는 ApplicationContext를 생성하는 방식으로 작동합니다.다시 말해 스프링 테스트를 위해 ApplicationContext를 생성합니다.🤔 webEnvironment 속성값@Sp..
🏨 수업 피드백1. cache vs pool두 개념의 차이점은 미묘하게 다르다. 구분하자.cache미리 만들어두기pool만든 게 있으면 꺼내쓰기/없으면 만들어 넣어두기고로 블랙잭에서 내가 활용한 개념은 cache이다(게임에 사용될 카드들을 미리 생성해 놓았기 때문) 2. 클래스 파일의 수클래스 파일이 많아지면 경계하는 의견이 있다. 보통 클래스 파일이 많아지면 내부 코드를 다 확인하는 등 유지보수가 힘들어질 것이라고 생각하기 때문이다. 하지만 객체를 잘 분리하면 이런 일이 없다. 내부 코드를 확인한다는 것 자체가 그 코드가 내가 예상하는 것처럼 행동할 거라는 확신이 없어서라고도 볼 수 있기 때문이다. 따라서 메서드 명으로 역할을 정확히 드러내서 시그니처만 보고도 이해할 수 있도록 하는 것이 중요하다. ..