본문 바로가기

전체 글270

통합, 단위 테스트 차이 어노테이션 설명 부모 클래스 Bean @SpringBootTest 통합테스트, 전체 IntegrationTest Bean 전체 @WebMvcTest 단위테스트, MVC테스트 MockApiTest MVC관련된 Bean @DataJpaTest 단위테스트, Jpa테스트 RepositoryTest JPA 관련 Bean None 단위테스트, Service테스트 MockTest None None POJO, 도메인 테스트 None None 통합 테스트 장점 모든 Bean을 올리고 테스트를 진행하기 때문에 쉽게 테스트 진행 가능 모든 Bean을 올리고 테스트를 진행하기 때문에 운영환경과 가장 유사하게 테스트 가능 API를 테스트할 경우 요청부터 응답까지 전체적인 테스트 진행 가능 단점 모든 Bean을 올리고 테스트를 .. 2023. 10. 13.
Transactional Propagation(트랜잭션 전파) 위와 같은 사유로 saveFrontIdcard에 @Transactional를 선언하지 않았다. 승건님의 도움으로 transactional의 부족한 부분을 알게 되어서 공부하게 되었습니다. 기본적인 트랙젝션 선언은 REQUIRED 가 기본적인 옵션이어서 부모 트랜잭션과 합류하게 된다. 그렇다면 부모 메소드에서 트랜잭션이 선언되었다면 굳이 왜 자식 메소드에도 트랜잭션이 선언되어야 하나? ⇒ 명시성, 코드의 가독성을 위해, 특정 작업이 트랜잭션 경계 내에서 실행되어야 한다는 것을 명시적으로 나타내기 위해 자식 메소드에도 **@Transactional**을 추가할 수 있습니다. 참고: https://devlog-wjdrbs96.tistory.com/424 2023. 10. 12.
[이펙티브 자바]아이템4 인스턴스화를 막기 위해 private 생성자 사용하기 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. 따라서 인스턴스 생성을 방지하는 것이 좋다 생성자에 주석으로 인스턴스화가 불가능한 이유를 설명하는 것이 좋다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. abstract클래스는'이 클래스는 상속을 한 후에 사용하세요'라는 용도의 클래스로 오해를 할 가능성도 존재한다. 자바에서는 아무런 생성자도 설정하지 않는 경우, 자동적으로 기본 생성자가 설정된다. 따라서 UtilityClass (추상 클래스)도 기본 생성자가 생성된다. 처음에 사용할 때 인스턴스화를 안 하면 어떻게 사용하지? 문제점 클래스 내부에서는 생성자 호출이 가능하고, 인스턴스를 생성할 수 있다는 것이다 해결 public class Utilit.. 2023. 7. 13.
[이펙티브 자바]아이템3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스 싱글턴 사용 이유 한번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다. 또한 싱글톤으로 생성된 객체는 무조건 한번 생성으로 전역성을 띄기에 다른 객체와 공유가 용이하다. 싱글턴의 한계 **private 생성자를 가지고 있기 때문에 상속할 수 없다.**private 생성자는 오직 싱글톤 클래스 자신만이 자기 오브젝트를 만들도록 제한한다.문제는 private 생성자를 가진 클래스는 다른 생성자가 없다면 객체지향의 장점인 상속과 다형성 사용이 불가능하다는 점이다. **싱글턴은 테스트하기가 어렵다.**클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트 하기가 어려울 수 있다.만들어지는 방식이 제한적이기 떄문에 테스트에.. 2023. 7. 13.
[이펙티브 자바]아이템2 생성자에 매개변수가 많다면 빌더를 고려하라 생성자와 정적 팩터리는 매개변수가 많을 때 적절히 대응하기 어렵다. 매개변수가 많을 때 문제 순서가 바뀌게 된다면 컴파일러는 알아채지 못 한다. 매개 변수가 몇 개인지도 알아야 한다. 많은 선택적 매개변수를 처리하기 위해 아래 두 가지 패턴이 사용되었다. 점층적 생성자 패턴 자바빈즈 패턴 불변성 문제 또한 완전히 생성된 객체라고 하더라도 외부적으로 세터 메소드를 노출하고 있으므로, 불변함을 보장할 수 없게된다. 즉, 자바빈즈 패턴을 사용하면 클래스를 불변으로 만들 수 없다. 점층적 생성자 패턴의 안전성 + 자바빈즈 패턴의 가독성 ⇒ 빌더 패턴 빌더 패턴의 단점 빌더 패턴도 장점만 존재하지는 않다. 선택적 매개변수를 많이 받는 객체를 생성하기 위해서는 먼저 빌더 클래스부터 정의해야한다. 빌더의 생성비용이 .. 2023. 7. 13.
[이펙티브 자바]아이템1 생성자 대신 정적 팩터리 메소드 정적 팩터리 메서드 객체 생성 역할을 하는 클래스 메서드다. 장점 직관성 이름으로 객체의 특성을 직관적으로 설명한다. public static Position createStartPosition() { return new Position(START_POSITION_VALUE); } Position position = Position.createStartPosition(); 생성자는 똑같은 타입을 파라미터로 받는 생성자 두개를 만들 수 없는데, 정적 팩토리는 가능하다 public class Person { String name; String address; private Person() { } private Person(String name) { this.name = name; } public static.. 2023. 7. 13.
[HearHere]HTTP 인증 방식 쿠키를 쓰는 이유 쿠키의 단점이 있으므로 보안하기 위해 세션을 같이 쓴다 JWT라는 방식도 있다 JWT의 단점을 보안해줄 전략 우리가 사용하고 있는 웹 사이트들의 경우, 한 번 로그인 하면 다시 로그인할 필요 없다. 심지어는 브라우저를 껐다 켜도 로그인이 유지가 되기도 하지요. 이는 HTTP의 비연결성 및 무상태성 특징을 보완한 기술인 Cookie와 Session 덕분이다. 1. Cookie 쿠키란 클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일을 일컫는다. 단점 보안에 취약하다. 요청 시 쿠키의 값을 그대로 보냅니다. 유출 및 조작 당할 위험이 존재합니다. 쿠키에는 용량 제한이 있어 많은 정보를 담을 수 없습니다... 2023. 7. 13.
[HearHere]DTO를 쓰는 이유 문제인식 과정 좋아요 누른 포스트 조회 API 테스트 도중 postman과 디버깅을 통해 스프링 컨텍스트에서 유저를 찾아오고, 유저의 heartList까지 값이 들어있는 것을 확인하였으나 heartList로 postlist를 만드는 과정에서 null 값임을 확인 문제해결 및 공부 과정 요약 https://velog.io/@neity16/4-스프링-부트와-JPA-활용-7-API-개발-고급-1-지연로딩-조회-성능-최적화 하이버네이트에서는 Lazy Loading으로 설정된 연관관계를 가진 객체에 대해서는,필드가 모두 Null로 설정된 프록시 객체를 반환 프록시를 먼저 알아야겠다. 프록시가 무엇이지? 프록시는. 값(Id값 제외)을 사용해야지 실제값을 반환해주구나. 그리하여, DTO를 사용한다 프록시 객체란 개념.. 2023. 7. 13.
[Hearhere프로젝트] ERD 작성시 고려해야 할 점 엔티티를 만드는 기준은 무엇이지? ‘좋아요’는 엔티티로 두어야 할 것인가 속성으로 두어야 할 것인가? 공부하는 이유 때론 직감점으로 혹은 경험으로 엔티티인지 속성인지 분류할 수 있다. 예를 들어 게시물은 엔티티이고 작성시간은 속성이다. 그렇지만 좋아요 기능은 판단하기 애매하다. 엔터티 관점: 사용자 중심의 관점에서 "좋아요"는 엔터티로 간주될 수 있다. 사용자가 수행한 작업이나 이벤트를 나타내며 특정 게시물에 대한 관심이나 승인을 나타낸다. 이러한 의미에서 "좋아요"는 시스템에 존재하는 독립적인 엔터티로 볼 수 있다. 엔티티로 둔다면 속성으로 둔 것보단 데이터관리 비용이 클 것이다 속성 관점: 한편, 게시물 중심적 관점에서 "좋아요"는 게시물 자체의 속성으로 볼 수 있다. 게시물의 인기도, 참여 수준 또.. 2023. 7. 13.