나의 개발일지



· JPA
JPA를 사용하다 보면 @OneToMany 단방향 연관관계를 걸게 되는 일이 있습니다. 문제@OneToMany 단방향 매핑에서는 엔티티가 관리하는 외래 키가 다른 테이블에 있어, 연관관계 관리를 위해 추가로 UPDATE SQL을 실행합니다. 간단한 예제를 통해서 살펴보겠습니다.  다음과 같이 테스트 코드를 작성해서 쿼리를 확인해보겠습니다.team 테이블에 대한 insert 쿼리와 외래 키를 업데이트하기 위한 update 쿼리가 각각 실행된 것을 확인할 수 있습니다.해결@JoinColumn(nullable = false, updatable = false) 옵션을 걸어주면 Many 쪽이 save될 때 FK 를 같이 넣어줘서 불필요한 update 쿼리가 발생하지 않습니다. 다시 테스트를 실행해 보면, inse..
보통 Web Layer(컨트롤러 계층)을 테스트할 때 슬라이싱 테스트인 @WebMvcTest를 사용합니다. 이번 글에서는 @WebMvcTest를 사용했을 때 불편했던 점들과 개선한 방법에 대한 경험을 공유하고자 합니다.@WebMvcTest란?여러 스프링 테스트 애노테이션 중, Web(Spring MVC)에 집중할 수 있는 애노테이션입니다.선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있습니다.단, @Service, @Component, @Repository 등은 사용할 수 없습니다. - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스컨트롤러 계층 만을 슬라이스 테스트할 수 있도록 도와주는 애노테이션입니다. WebMvcTest (Spring Boot 3.1.2 API)..
· 회고
8월 9일을 시작한 GDSC 모던 자바 인 액션 스터디가 오늘(10월 9일) 8주차 Optional 클래스와 날짜와 시간 클래스 학습으로 마무리됐다. 처음 진행해 본 강의식 스터디를 리뷰해보려고 한다. 왜 했는가? 2021년 초로 기억한다. 스프링을 학습하기 위해 인프런에 올라온 스프링 입문 강의를 듣는데, 다음과 같은 코드를 보여주셨다. 강사님께서는 이 강의가 자바 8 강의는 아니니까 ~ 라고 말씀하시면서 강의를 이어나가셨지만, 자바 8 문법에 익숙하지 않았던 수강생인 나는 매우 당황스러웠다. 그당시 들었던 의문점은 다음과 같다. 화살표는 어떤 의미이지..? Member를 왜 Optional로 감싸서 반환하지..? stream()을 꼭 선언해줘야 filter를 쓸 수 있는걸까? 사실상 자바 8에 대한 ..
· Java
들어가며 GDSC 모던 자바 인 액션 스터디 발표자료를 준비하기 위해 책을 읽어보던 도중, 책에서 Enum 비교를 위해 공통적으로 equals 메서드를 사용하는 것을 알게 되었습니다. Enum은 == 비교가 가능하며 이에 따른 이점이 존재하므로, 강의를 진행함에 있어서 책에서 제공하는 소스 코드와 다르게 진행하게 된 이유를 말씀드리고자 합니다. 우리는 String의 문자열 내용을 비교할 때는 String의 equals 메서드를 사용합니다. JLS, 15.21.3 Reference Equality Operators == and != 를 보면 해당 내용에 대한 설명이 잘 나와있습니다. (마지막 문단) == 는 String 유형의 참조를 비교하는데 쓰일 수 있지만, 이러한 동등성 테스트는 두 피연산자가 동일한..
· test
이번 글에서는 Java 진영에서 테스팅을 위해 사용되는 프레임워크인 JUnit을 만들어보겠습니다. 참고 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞습니다(JUnit) 반면에 내가 작성한 코드가 직접 제어의 흐름을 담당하면 그것은 프레임워크가 아니라 라이브러리입니다.(스트림 라이브러리) https://curlunit.sourceforge.net/doc/cookstour/cookstour.htm JUnit A Cook's Tour를 참고해서 진행하겠습니다. 먼저 기본 개념인 TestCase를 나타내는 개체를 만들어야 합니다. 개발자는 종종 테스트 사례를 염두에 두고 있지만 다양한 방식으로 이를 실현합니다. print statements debugger expressions..
· Spring
🤔문제 발생 https://blogs.jsbisht.com/blogs/2016/09/07/json-deserialize-generic-types-using-gson-and-jackson https://blogs.jsbisht.com/blogs/2016/09/12/deserialize-json-with-java-parameterized-constructor 재밌는 예제가 나와있는 문서를 찾아, 따라해보고 있었습니다. @RequestBody로 넘겨준 JSON은 다음과 같습니다. { "status": true, "code": 200, "data": { "id": "123456", "profileUrl": "https://www.facebook.com/123456" } } 작성한 API를 테스트하기 위해, Re..
· CS
팀 프로젝트에서 Oauth2.0 프로토콜과 JWT를 사용한 소셜 로그인을 구현하다가 다음과 같은 의문점이 들었습니다. Oauth가 정확히 무엇일까? JWT를 사용한 로그인 방식은 세션을 이용한 로그인 방식과 어떤 차이점이 있을까? 장단점은 무엇일까? 401 Error가 발생하는 이유는 무엇일까..? 이러한 의문점들을 해결하고자, 로그인 관련 정보들을 정리해서 공부해야겠다는 생각이 들었습니다. 다음과 같은 순서로 진행됩니다. HTTP 프로토콜의 특성 로그인 - 쿠키 로그인 - 세션 로그인 - 필터, 인터셉터 Oauth: Open Authorization JWT Oauth 2.0 소셜 로그인 과정 CORS 1. HTTP 프로토콜의 특성 기본적으로 HTTP 프로토콜 환경은 “connectionless, sta..
· Java
SOLID 클린코드로 유명한 로버트 마틴이 좋은 객체지향 설계의 5가지 원칙을 정리 SRP : 단일 책임 원칙 (Single responsibility principle) OCP : 개방-폐쇄 원칙 (Open/closed principle) LSP : 리스코프 치환 원칙 (Liskov substitution principle) ISP : 인터페이스 분리 원칙 (Interface segregation principle) DIP : 의존관계 역전 원칙 (Dependency inversion principle) SRP 단일 책임 원칙 Single responsibility principle 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 ..
· Java
static 예약어가 붙으면 JVM이 시작될 때 Method(static) 영역에 저장됩니다. 그리고 프로그램이 끝날 때까지 사라지지 않고 메모리에 남아있습니다.(Java 기준) 따라서 GC의 대상이 아닙니다. 라고 알고 있었는데, 공식 문서나 블로그를 찾아보면 static이 heap 영역으로 할당된다는 말이 있어 혼란스러웠습니다. 우선, 근본적인 고민은 다음과 같은 리뷰어님의 리뷰에서 시작되었습니다. 다른 곳에서 RaceGameController.printResultHeader(); 와 같은 방식으로 호출하지 않기 때문에 static을 지우고 커밋했습니다. 그 후 객체지향 설계와 클린 코드의 관점에서 봤을 때 static 예약어의 사용은 좋을까? static으로 선언하면 GC의 대상이 될까? 라는 의문..
홍익대학교 개발자 멘토링에 참여하면서 TDD로 문자열 계산기를 구현하라는 미션을 받았습니다. 요구사항 중 문자열 계산기에 숫자 이외의 값 또는 음수를 전달하는 경우 RuntimeException 예외를 throw한다 라는 내용이 있어, 다음과 같은 검증 메서드를 구현했습니다. private static void checkInputIsNegative(String input) { if (getParseInt(input) < NEGATIVE_NUMBER_STANDARD) { throw new RuntimeException("숫자 이외의 값 또는 음수는 계산할 수 없습니다."); } } 리뷰어분께서 다음과 같은 리뷰를 남겨주셨는데, 지금까지 예외에 대해 잘 알아보지 않고 사용한 것 같아서 이펙티브 자바를 통해 ..
keep it real
'분류 전체보기' 카테고리의 글 목록