@InjectMocks 는 구현체여야 하는데, 구현체 타입으로 명시하고 싶지 않은 경우
2023. 1. 3. 19:51
Spring
@InjectMocks 는 구현체여야 하는데, 구현체 타입으로 명시하고 싶지 않은 경우 @InjectMocks 를 사용하기 위해서는 구현체 타입이어야 한다. 생각해보면 당연하다. 해당 객체가 갖는 의존성들을 모킹해서 주입해주겠다는 것인데, 실제 구현 객체가 누구인지, 그리고 그 객체가 어떤 이들에 대해 의존성을 갖고 있는지도 모르고 어떻게 모킹해서 주입을 해 주겠는가. 당연한 거지만 이로인해 약간의 고민이 생겼어서 기록해 보았다. 아래와 같은 계층 구조 일 때, JoinAccountService 라는 “회원가입 책임” 을 가진 서비스를 테스트 하고 싶었다. 이 때 JoinAccountService 는 인터페이스로, AccountService 에서는 해당 인터페이스를 구현하는 구현체로서 두었다. 테스트 대..
[Item 73] 추상화 수준에 맞는 예외를 던져라
2022. 12. 31. 18:32
책/effectiveJava
이런 상황이 있다고 가정 해보자! 저수준 예외를 처리 하지 않으면서, 그대로 바깥으로 전파할 때 생기는 일?예외 발생 시, 수행하려는 일과 관련 없어 보이는 예외가 나올 수도 있다. → 어떤 로직 에서 이러한 예외가 발생했는지 파악하기가 힘들어져 디버깅 이 어려워진다그리고 보통(?) 이 예외와 관련된 예외 메시지를 응답으로 보내주기 때문에, 사용자 입장에서는 뜬금없는 SQLException 과 관련된 에러 메시지를 응답으로 받게 될 수도 있다..고 생각한다.내부 구현 방식을 드러낸다이를 사용하는 클라이언트가 오염된다. 다음 릴리즈 에서 내부 구현을 변경하며 예외도 달라지 면, 이를 사용하던 기존 코드가 깨진다.저수준 예외를 처리하지 못한다면, 어떻게 해줘야 할까?예외가 발생하면 우리는 흔히들 아래와 같이..
카티션 곱, JOIN 에서 USING, ON / JOIN 에서 ON 과 WHERE
2022. 10. 31. 09:06
DB
🔧 카티션 곱과 NATRUAL JOIN 🔧 카티션 곱 SELECT a,b FROM A,B WHERE A.dept_name = B.dept_name; 두 릴레이션의 모든 tuple들에 대한 조합을 가진 릴레이션을 생성한다. 🔧 Natural Join —> MySQL 의 NATURAL JOIN 카티션 곱과의 차이 : 두 릴레이션의 스키마에서 나타나는 {{ 공통속성 ] 의 값이 같은 Tuple의 짝만 } } 고려 한다. 결과 릴레이션에서는, { 하나의 속성 } 으로 통합된다. 즉, A relation에 name attribute가 존재, B relation에 name attribute가 존재했다면, 결과 릴레이션에 존재하는 name attribute는 하나다.( 두 개가 아니다 ) 🔧 속성을 잘못 동일시 하는..
SELECT DISTINCT 와 ORDER BY 가 함께 쓰이는 경우 정렬은 예상하지 못하게 일어난다
2022. 10. 28. 20:56
DB
이번주 코테가 여러개 있어.. SQL 공부를 다시 하고 있다. 그 김에 팀프로젝트에서 알게 되었던 내용에 대해 다시 정리해 보았다. 🔧 SELECT DISTINCT 와 ORDER BY 가 함께 쓰이는 경우 정렬은 예상하지 못하게 일어난다 팀프로젝트를 하는데, 팀원 분의 쿼리에서 예상했던 결과가 나오지 않고 있었다. 나 역시 해당 쿼리로 해결 할 수 있을 거라 생각했는데 원하는 결과가 나오지 않았고, 이를 해결하는 과정에서 SELECT DISTINCT 와 ORDER BY 가 함께 쓰는 경우, 주의해야 함을 알게 되었다. 🔧 당시 상황 study - book 은 다대일 관계 ( study -> book 으로 book 의 pk 를 참조하고 있다 ) 쿼리로 가져오려고 한 것 : 최근에 스터디가 생성된 책 목록을..
Controller api 가 생각처럼 출력되고 있지 않다
2022. 9. 11. 21:46
Spring
상황 프론트에서 현재 504 타임아웃 서버 에러가 뜬다는 연락을 받았다 (후에 이 상황의 원인은 vercel 의 서버와 백엔드 서버의 지역이 달라서 생기는 타임아웃 문제 였던 것으로 밝혀졌다) 따라서 프론트에서 문제가 생겼다고 말한 api 를 호출해 보는데 로그에서 이상한 것을 발견했다. 18:10:17.702 [http-nio-8080-exec-9][LoginUserId-1] INFO c.d.c.g.l.a.ControllerLoggingAspect - params : {controller=StudyApi, http_method=GET, method=getDetailInfo, params={}, log_time=Wed Sep 07 18:10:17 KST 2022, request_uri=/api/studi..
Java 에서 Stack 구현체로는 무엇을 사용해야할까?(feat_Java로 코딩테스트 문제 풀기)
2022. 9. 2. 12:19
Java
Stack LIFO -> 처음 넣었던 원소는, 마지막에 꺼낼 수 있다. "끝" 에 대한 삽입과, 제거만을 허용한다 Stack 은 Array, LinkedList 등등을 사용하여 구현할 수 있다. 사실 자료구조상, 양 쪽(out,in 하는 곳) 이 모두 뚫려 있더라도, 제공하는 작업이 pop, push 이기만 해도 stack 으로 제공가능하다. 따라서 Queue 도 스택으로 사용이 가능하다. Java 에서 Stack 을 위해 어떤 구현체를 사용해야할까? 그렇다면 Java 에서 Stack 으로 사용할 자료구조에는 무엇이 있을까? 그냥 Stack 사용하면 안됨?? 흠.. 가장 먼저, "Stack" 클래스를 살펴보자! Java 의 Stack 에 대한 문서에는 이런 구절이 존재한다 A more complete a..
[git] squash and merge 로 인하여 dev 브랜치를 매 번 새로 파던 이슈
2022. 8. 30. 11:43
카테고리 없음
git 에 대해 잘 모른 채로 어깨너머로 팀원들의 현란한 깃 명령어들만을 구경해 왔다. 이번 프로젝트 때 squash merge 라는 것을 사용하였는데, 이로 인해 예상하지 못했던 상황이 벌어졌었어서 이에 대해 정리 해 본다. 상황 : 우리 프로젝트에서의 브랜치 전략과 merge 전략에 따른 문제점 파이널 프로젝트에서 새로운 브랜치 전략을 도입하며, squash merge 를 적극 활용하기로 했다. 좋은시도였으나 우리모두 다음엔 이렇게 하지 말자..라는 결론이 지어진 방식이 되어버렸다 🥲 하지만 이는 조직마다 선택에 따라 달라질 문제고 이번에 우리가 선택한 방식에서 조금 변경하면 괜찮을수도? 있겠다는 결론을 내렸다. 이는 뒤에서 보자! 우리의 브랜치 전략은 main, develop, feat 브랜치..
선언적 트랜잭션과 programmatic 트랜잭션
2022. 8. 27. 17:33
Spring
Spring 에서는 @Transactional 이라는 어노테이션을 통해 트랜잭션을 쉽게 사용할 수 있다. 스프링에서는 이를 사용하는 방식을 “선언적 트랜잭션을 사용한다" 라고 표현한다. 내부적으로는 AOP 를 사용하여 구현된다. 이미 다들 알겠지만.. AOP 는 “cross-cutting-concern” 즉, 어플리케이션 전반에 걸친 공통적인 관심사 (대표적으로, 커넥션을 가져오고 커넥션을 반환하여 트랜잭션 설정 하는 것 ) 를 비즈니스 로직 으로 부터 분리 시켜 줄 수 있다. 스프링에서 AOP 는 “메소드 레벨 단위로만 적용 가능" 하다는 특징이 있다. 여기서 @Transactional 역시 메소드 레벨로 적용되는 AOP 로 구현되어있다 보니 생기는 문제점은 트랜잭션의 범위를 좁게 유지할 수 없다. 는..