[Spring] 예제를 통해 전략 패턴(Strategy Pattern)에 대해 알아보기
·
Web
개요템플릿 메서드는 상속을 이용한 패턴이다보니 상속에 관한 단점들을 그대로 안고갔다. 이러한 문제를 전략 패턴을 통해 풀어보겠다.템플릿 메서드 패턴을 알고싶다면 여기 를 클릭하면 된다.  전략 패턴(Strategy Pattern)이란?실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다. 캡슐화한 특정 계열의 알고리즘들을 정의하고 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다. 쉽게 설명하자면 변하지 않는 부분(Context)라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는  것이다.  예제를 통한 전략패턴 알아보기말로 이해하기 어려우므로 예제를 통해 알아보자. Strat..
[Spring] 예제를 통해 템블릿 메서드 패턴에 대해 알아보기
·
Web
개요만약 잘 만들어진 애플리케이션에서 각각의 클래스안에 있는 메서드에 실행시간 등 정형화된 로그를 추가하라는 미션이 주어졌을 때 제일 쉬운 방법은 각 메서드마다 로그를 출력하는 코드를 추가하는 것 일것이다.예) private final OrderServiceV3 orderService; private final LogTrace trace; @GetMapping("/v3/request") public String request(String itemId) { TraceStatus status = null; try { status = trace.begin("OrderController.request()"); // 로그 출력 시작 ..
[JPA] 페치조인과 일반 조인의 차이점
·
JPA
페치조인과 일반 조인의 차이점을 알아보기 앞서 먼저 페치조인에 대해 알아보자. 페치조인페치조인은 SQL의 조인 종류는 아니다. JPQL의 전용기능이고,  JPQL에서 성능 최적화를 위해 제공하는 기능이다. 한마디로 설명하자면 연관된 엔티티나 컬렉션을 하나의 SQL에 함께 조회하는 기능이다. 예제// Member.java@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; private Str..
[JPA] JPQL의 경로표현식이란?
·
JPA
경로 표현식이란?.(점)을 찍허 객체 그래프를 탐색하는 것이다.다음과 같은 코드가 있다고 가정해보자.@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); private String username;}단순히 Team은 @ManyToOne으로 다대일 연관관계를..
[JPA] JPQL의 프로젝션, 페이징
·
JPA
프로젝션프로젝션이란? SELECT 절에 조회할 대상을 지정하는 것이다.프로젝션 대상은 크게 세가지로 나눌 수 있는데, 엔티티 타입, 임베디드 타입, 스칼라 타입이 있다.SELECT m FROM Member m : 엔티티 프로젝션SELECT m.address FROM Member m: 임베디드 타입 프로젝션SELECT m.username, m.age FROM Member m: 스칼라 타입 프로젝션예제를 통해 알아보자. @Autowired EntityManagerFactory emf; EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.b..
[JPA] JPA의 타입 (임베디드 타입, 값 타입, 컬렉션 타입)이란?
·
JPA
1. 임베디드 타입주로 자바에서의 기본 값 타입(int, String)을 모아서 만들어서 복합 값 타입이라고도 한다.예를들어 과일이라는 엔티티는 이름 가격 수량을 가진다고 가정을 했을 때 가격과 수량은 뭔가 공통으로 묶을 수 있지 않을까라는 생각을 해보자.다음과 같이 Fruit라는 엔티티안에 PriceCount라는 복합 값 타입을 선언하는 걸 임베디드 타입이라고 부른다.JPA에서는 @Embeddable, @Embedded라는 어노테이션으로 임베디드 타입을 선언한다.@Embeddable: 값 타입을 정의하는 곳에 표시@Embedded: 값 타입을 사용하는 곳에 표시그리고 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null이다. 임베디드 타입의 장점재사용이 용이해진다높은 응집도를 가진다.해당 ..
[Swagger] 스웨거 오류: Unable to render this definitionThe provided definition does not specify a valid version field.
·
Error Log
기술스택Spring Boot 3.4.0JDK 17gradle  개요스프링 부트에 Swagger의존성 추가 후 실행시키니 다음과 같은 오류가 발생했습니다.Unable to render this definition The provided definition does not specify a valid version field.Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.x.y (for example, openapi: 3.1.0). 다른 블로그를 아무리 찾아서 따라해봐도 해결이 안되는 상황이였습니다.  해결 방법htt..
[Querydsl] No sources given 에러
·
Error Log
개요다음과 같은 코드에서 "java.lang.IllegalArgumentException: No sources given"이 발생했다 @Test public void fetchJoinNo() throws Exception { //given em.flush(); em.clear(); //when Member findeMember = queryFactory.select(member) .where(member.username.eq("member1")) .fetchOne(); //then }   해결방법알고보니 from 절이 빠져서 발생하던 오류였다.from을 추가한 ..
[JPA] 프록시와 지연로딩, 즉시로딩
·
JPA
개요Member와 Team 엔티티가 존재한다고 가정해보자만약 Member를 조회할 때 Team도 함께 조회를 해야할까?결론부터 말하자면 JPA는 Member만 조회하고 싶을 때 Team 객체를 프록시 객체로 넣어주는 기능을 지원한다.어떤 방법을 동작하는지 알아보자.  1. 프록시- 프록시 기초프록시(Proxy)는 객체 지향 프로그래밍에서 실제 객체를 대신해서 대리 역할을 수행하는 객체다.JPA에서 엔티티 조회시 즉시로딩이 아닌 지연로딩으로 설정하면 필요할 때만 로딩하도록 엔티티 내부에 존재하는 연관 객체에 프록시 객체를 넣어준다. - 프록시 특징프록시 객체는 실제 클래스를 상속 받아서 만들어진다. 프록시 객체는 실제 객체의 참조(target)를 보관한다.프록시 객체를 호출하면 프록시 객체는 실제 객체의 ..