728x90

Spring Boot

    [JPA] JPQL (Java Persistence Query Language)

    JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. 이번 글에서는 다양한 객체지향 쿼리 중 JPQL에 대해 다룰 것이다. JPQL이란? JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. 문법은 SQL과 유사하며 간결하다. JPQL은 결국 SQL로 변환된다. 또한 JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다는 특징이 있다. 데이터베이스 방언만 변경하면 JPQL을 수정하지 않아도 데이터베이스를 변경할 수 있다. 기본 문법과 쿼리 API JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE문을 사용할 수 있다. 아래의 JPQL 문법을 보면 전체 ..

    [스프링] AWS S3에 이미지 업로드 하기

    spring boot로 서비스를 구축할 때 반드시 구축해야 할 것이 정적 파일 업로더이다. 이번 포스팅에는 AWS S3와 연동하여 이미지를 업로드 해볼 것이다. AWS S3 bucket 생성 [AWS -> S3 -> 버킷 만들기]로 들어와 새로운 버킷을 만든다. 버킷을 만들 때, 권한을 수정한다. 권한을 수정하지 않고 파일을 업로드하면, 퍼블릭 액세스가 차단된 상태이기 때문에 아래의 403 에러가 발생한다. Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: ~~~ ; S3 Extended Request ID: ~~~) 따라서 예제에서는 퍼블릭 엑세스 차단 해제를 하고, 버킷 정책을 설정하는 방..

    [스프링] 배포용 서버에 데이터베이스 Schema 및 Data 초기 설정하기

    스프링 부트로 개발을 할 때 보통 개발단계에서는 h2를 많이 사용한다. 또한 JPA를 사용하면 하이버네이트가 자동으로 테이블을 생성해주기 때문에 개발 단계에서는 DDL을 신경 쓸 필요가 없다. 하지만 실제 배포 단계에서는 하이버네이트가 자동으로 생성해주는 sql을 사용하는 것은 위험하다. 따라서 spring.jpa.hibernate.ddl-auto을 none으로 설정하고 schema.sql을 작성해주는 편이 좋다. profile 파일 분리 우선 배포용 서버에서 사용하는 profile 파일이랑 개발 단계에서 사용하는 profile 파일을 분리해야 한다. application.yml에서는 dev profile을 활성화시켜주고, 배포할 때는 스크립트 파일에서 따로 real profile을 활성화시켜줄 것이다...

    [JPA] JPA 변경 감지와 병합(merge)

    준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 임의로 만들어낸 엔티티라도 기존 식별자를 가지고 있는 경우(JPA가 식별할 수 있는 id를 가지고 있는 경우)에는 준영속 엔티티라고 말한다. 준영속 엔티티를 수정하는 2가지 방법 1. 변경 감지 2. 병합(merge) 변경 감지 @Transactional public void update(Item itemParam){ // itemParam : 파라미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); // 같은 엔티티를 조회한다. findItem.setPrice(itemPrice.getPrice()); // 데이터를 수정한다. } 영속성 컨텍스트에서 ..

    [스프링] 프록시 기반 AOP(Aspect Oriented Programming) 정리

    AOP (Aspect Oriented Programming) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. AOP 주요 개념 개념 설명 Aspect 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화 한다. Target Aspect를 적용하는 곳 (클래스, 메소드,...) Advice 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체 JoinPoint Advice가 적용될 위치, 끼어들 수 있는 지점이..

    [스프링] IoC(Inversion of Control), DI(Dependency Injection), Spring Container, Bean 정리

    의존성 역전(Inversion of Control) IoC란 Inversion of Control의 약어로, 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 중복, 유지보수를 편하게 할 수 있게 한다. 의존성 주입(Dependency Injection) DI란 Dependency Injection의 약어로, 번역하면 의존성을 주입한다는 말이다. 말 그대로 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입을 시켜주는 방식이다. 무슨 말인지 모르겠으니 아래의 예시를 통해 알아보자. 일반적으로 의존성에 대한 제어권은 객체 자기 자신이 갖는다. 아래의 코드는 Sample이라는 클래스에서 Apple 객체를 불러오는 예제이다. 의존관계는 간단히 말해 new..

    [스프링] 오픈 api 사용해서 데이터 가져오기 (네이버 영화 검색 api)

    네이버 오픈 api를 사용해서 영화를 검색하는 애플리케이션을 구현해보려고 한다. 오픈 api에 대한 정보를 네이버 오픈 api 검색 > 영화에 있다. 오픈 API 이용 신청 오픈 api를 사용하려면 보통 key가 필요하다. 아무나 막 가져다 쓰는 것을 막기 위해 보통 key를 api 호출 시 header에 넣어서 사용한다. key 발급을 위해 우선 api 이용 신청을 한다. 초록색 버튼의 [오픈 API 이용 신청]을 누르면 애플리케이션 등록 화면이 나오고 본인의 애플리케이션을 등록하면 된다. 등록을 마치면 내 애플리케이션 카테고리에서 Client ID와 Client Secret을 확인할 수 있다. 이 값이 위에서 말한 key 값이다. 코드를 구현하기 전에 Postman으로 테스트를 해보니 정상적으로 반환..

    [스프링] Spring 웹 계층

    1. Web Layer 흔히 사용하는 컨트롤러(Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역이다. 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 의미한다. 2. Service Layer @Service에 사용되는 서비스 영역이다. 일반적으로 Controller와 Dao의 중간 영역에서 사용된다. @Transactional이 사용되어야 하는 영역이기도 하다. 3. Repository Layer Database와 같이 데이터 저장소에 접근하는 영역이다. Dao(Data Access Object) 영역이라고 생각하면 된다. 4. Dtos Dto(Data Transfer Object)는 계층 ..

728x90