Web Dev/Spring 8

[JPA] 정적 쿼리와 동적 쿼리

JPA를 사용하여 쿼리를 작성하다보면 동적 쿼리의 필요성에 대해 느낄 때가 있다. 다음 예시를 통해 정적쿼리에서 동적쿼리가 필요할 때 어떤 방식들이 있었는지 정리해보았다. 정적 쿼리를 사용하는 상황 예를들어 이름과 상태 값에 따른 결과 검색을 해야하는 상황이 있다고 생각해보자. JPA를 사용하게 되면 JPQL 쿼리를 입력하고 이름과 상태 파라미터에 맞는 값들을 바인딩해주어 결과를 받는 코드를 작성할 수 있다. em.createQuery("select o from Order o join o.member m" + " where o.status = :status" + " and m.name like :name", Order.class) .setParameter("status", orderSearch.getO..

Web Dev/Spring 2023.03.23

[Spring+JPA] 간단 노트 정리

`@SpringBootApplication`가 존재하는 패키지 및 하위 패키지 모두를 스캔하여 빈으로 올린 후 실행한다. Spring이 Repository의 `@PersistenceContext` 어노테이션을 확인하고 자동으로 EntityManager를 생성 후 주입시켜준다. 원래 JPA를 쓰려면 팩토리에서 직접 EntityManager를 꺼내 써야 하지만 Spring이 이를 자동화해준다. 만약 팩토리를 주입받고 싶다면 다음과 같이 `@PersistenceUnit` 어노테이션을 사용하면 된다. @PersistenceUnit private EntityManagerFactory emf; Spring Data JPA가 `@PersistenceContext` 대신 `@Autowired`만 사용해도 자동 주입을 ..

Web Dev/Spring 2023.03.17

[JPA] 도메인 설계 정리

초보 개발자의 객체 지향에 대한 실수 회원과 주문의 관계에서 사람의 생각으로 회원을 통해서 주문을 생성한다고 생각할 수 있는데 시스템은 이 둘 엔티티를 동급으로 놓고 생각해야하기 때문에 주문을 생성할 때 회원이 필요하다고 생각하는게 맞다. 어떤 회원의 주문 기록이 필요하다면 회원에 접근하여 주문을 찾는게 아니라 주문에서 회원의 조건을 걸고 찾는 것이다. 연관관계의 주인 만약 회원과 주문에 일대다,다대일의 양방향 관계를 가진다면(실제로는 회원에 주문 컬렉션이 필요가 없다.) 양방향 관계의 주인을 정해야하는데 주문이 '다'를 담당하여 복수의 갯수를 가지므로 연관관계에서 주인으로 정하는 것이 좋다. 보통 관계형 데이터베이스에서는 연관관계의 주인인 주문이 외래 키를 가지게 된다. 연관관계 주인 쪽에 실제 값을..

Web Dev/Spring 2023.03.14

[Spring] 스프링 빈 충돌 이슈 관리

스프링에서 빈들을 관리할 때 객체지향의 다형성이라는 특징을 이용하여 애플리케이션의 유연함을 늘리게 된다. 이 때 개발자는 의존 주입을 하기 위해 하위 타입의 객체를 만들게 되는데 이 때 단순히 타입을 입력하여 자동 주입을 받게 되면 상위 타입에 매칭되는 빈들 중에서 어떤 빈을 사용해야하는지 혼동이 와 충돌이 생길 가능성이 있다. 이를 해결하기 위해서는 스프링에서 어떻게 관리해주어야 하는지 알아보자. 스프링에서 빈 조회가 2개 이상 되는 문제를 해결하기 위한 방법은 다음과 같은데 하나씩 알아보자. @Autowired 필드 명 매칭 @Qualifier -> @Qualifier끼리 매칭 -> 빈 이름 매칭 @Primary 사용 @Autowired 필드 명 매칭 Autowired로 자동주입 받을 때 스프링은 다..

Web Dev/Spring 2023.03.12

Spring - Paging 처리

Pagination 본인은 전통적인 서블릿 JSP 기반 프로젝트에서 페이지네이션을 하기 위에 List를 받아와 나누어 사용하는 Paging 알고리즘을 이용하여 해본 경험 뿐이 없었다. Pagination을 깔끔하고 이쁘게 만들려면 상당히 복잡했던 기억이 있다. 이 후 Spring을 유튜브를 통해 처음 공부하면서 스프링에서 표준화한 Pageable 객체를 처음 접했고, 이런 방법이 있구나 하면서 신기해 했던 기억이 난다. Spring Data JPA를 통해서 Paging을 할 것이므로 먼저 문서를 찾아보기로 했다. 1. Spring Data JPA 공식 문서 Page 검색해보기 검색해보니 현재 기준 대략 105건 정도가 나온다. 1. 3.4.4. Special parameter handling 첫번째로 다..

Web Dev/Spring 2022.08.22

Spring Security - Filter의 동작 원리

Spring Security 동작 원리 이해하기 이 글은 다른 글들을 짜집기하여 본인의 Spring Security 이해를 돕기 위해 작성하는 글입니다. Security를 커스터마이징하여 사용하기 앞서 동작 원리를 이해하고 프로젝트에 적용하기 위해 정리를 합니다. Spring Security는 웹 서비스에서 MVC 패턴 이전에 작동하는 `필터`로서 동작합니다. 필터란 클라이언트 요청이 서블릿으로 가기 전에 먼저 처리할 수 있도록 톰캣(WAS)에서 지원해주는 기능입니다. 그래서 설정도 톰캣의 설정파일인 `web.xml`에 하지만, 스프링 부트를 사용하는 환경이고, 최신 스프링 부트(2.7 버전 이상)에서는 컴포넌트 기반의 설정을 지향하므로 컴포넌트 기반의 설정법을 다루어볼 예정입니다. 이 글의 중심은 Sp..

Web Dev/Spring 2022.08.02

IoC, DI, 컨테이너 그리고 Bean

IoC, DI 그리고 컨테이너 모든 객체는 클라이언트 객체와 서버 객체로 나뉜다. 이 때, 호출하는 객체가 호출 당하는 객체에게 의존적이며 의존 관계에 있다고 표현한다. IoC 제어의 역전 (Inversion of Control) 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 직접 조종했다. 개발자 입장에서는 당연한 흐름이다. 반면에 AppConfig(스프링의 역할을 대신 해주는 커스텀 클래스)가 생긴 이후에는 구역 영역과 사용 영역으로 나뉘어 AppConfig는 사용해야하는 객체를 구현하고 역할을 표현하는 일만하고 사용 영역은 비즈니스 로직을 담당하게 되었다. 이렇게 객체가 스스로 사용해야하는 객체를 ..

Web Dev/Spring 2022.07.29

스프링 시작시 코드를 실행 시키는 3가지 방법

스프링 시작시 코드를 실행 시키는 3가지 방법 캠프 강의를 듣다가 스프링 부트를 시작하는 main메소드가 들어있는 OOOApplication.java 내부에 새로운 메소드를 만들어 테스트를 진행하는 것을 보고 정리해두면 좋을 것 같아 적는다. 스프링 부트가 시작되고 각 빈들이 만들어지게 되는데 이 때 초기화를 하고 필요한 로직을 끼워 넣는 방법이다. 사용할 일이 있을 것 같긴 하나 구체적으로는 모르겠어서 일단 정리해둔다. 0. 스프링 부트 애플리케이션 main 메소드 내부에 코드 넣기 제일 쉬운 방법이다. 스프링을 시작하려면 이 main method를 거쳐가게 되고, 그 이후에 어떤 코드를 넣는다면 스프링 부트가 초기화되고 난 이후에 바로 실행이 가능하다. 다만, 보통의 경우에는 스프링을 통해 생성된 빈..

Web Dev/Spring 2022.07.22