Spring 152

로그인한 사용자 정보 받아오기

Spring Security를 사용하여 로그인, 로그아웃을 구현해놓았다. 또한 회원 가입시에 Spring Security를 통해서 비밀번호를 암호화하여 저장하도록 하였다. 초기버전에서의 새로운 게시물 작성은 Member 엔티티를 추가하기 이전이였기 때문에 작성자를 직접 입력하는 식으로 구현되었다. 하지만 현재 Member 엔티티를 추가하여 로그인, 로그아웃을 구현해놓은 상태이기 때문에 Authentication 객체를 사용하여 세션 정보를 가져와 작성자를 고정시키는 방식으로 변경하였다. 게시물을 작성하면 세션 정보를 가져와 작성자는 disabled Authentication를 파라미터로 받아 위와 같이 사용하였다. 스프링 시큐리티를 처음 사용해보았는데 굉장히 성숙도가 높은 부분인 것 같아 추후에 따로 공..

조회수 기능, 페이징, 정렬

현재 게시물 CRUD 기능은 구현이 되어있는 상태이다. 스프링 데이터 JPA를 사용하여 굉장히 편리하게 구현하였다. 조회수 기능 조회수 기능의 구현 로직은 굉장히 간단하다. 그냥 해당 게시물을 조회할 때 조회수 필드를 +1 시켜주면 된다. 프로젝트를 진행할 때에는 Setter를 사용하여 값을 변경하는 습관은 매우 좋지 않은 습관이다. 그 외에 따로 조회수 필드를 변경할 수 있는 메서드를 만들어서 진행하였다. 이는 서비스 계층에서 호출되어 사용된다. JPA의 Dirty Checking 기능을 사용하여 조회수를 1씩 올려주는 식으로 구현하였다. 서비스 계층의 클래스 레벨에서 @Transation(readOnly=true)로 설정해놓고 생성, 수정이 일어나는 메서드 레벨에서 위와 같이 @Transaction을..

프로젝트 시작과 설계

사용 기술 - Spring MVC - Spring Boot - Spring Data JPA - Querydsl IDE - IntelliJ DB - MySQL Template Engine - Thymeleaf UI - BootStrap 점진적으로 기능을 추가시켜나갈 예정 먼저 게시물 CRUD 기능을 완성하고 조회수 기능, 페이징과 정렬을 적용시킬 것이다. 그 다음으로는 로그인/로그아웃, 회원 가입 기능을 추가시켜 로그아웃 상태에서는 게시물을 조회할 수 없도록 설정할 것이다. 또한 게시물을 검색할 수 있는 동적쿼리를 Querydsl을 사용하여 구현해볼 예정 그 이후에 추가할 기능들은 생각중.

Spring MVC의 HiddenMethod 기능 사용하기

기본적으로 HTML Form의 method 속성은 post와 get 방식 밖에 지원하지 않는다. 그렇다면 HTML Form을 사용할 때는 @DeleteMapping을 사용하지 못하는 걸까?? Spring MVC는 HiddenMethod 기능을 통해 HTML Form이 제공하지 않는 delete, put과 같은 메서드를 사용가능하게 해준다. input 타입을 hidden으로 사용자가 원하는 http메서드 방식을 스프링에게 알려주면 스프링 MVC가 내부적으로 이를 사용가능하게 해주는 방식으로 동작한다. 예전에는 @Configuration을 통해 스프링 빈에 등록시켜고 web.xml을 통해 filter를 설정해주어야했지만 최신 스프링부트에서는 application.properties나 yml에 등록해주면 바로..

Spring 2021.06.21

기본 문법

JPQL을 사용하여 회원 이름으로 조회하기 Querydsl을 사용하여 회원 이름으로 조회하기 JPAQueryFactory에 EntityManager 객체를 넣어줌. 훨씬 더 직관성이 있고 알아보기 쉽다. 파라미터 바인딩을 해주지 않아도 알아서 처리해준다. Querydsl은 JPQL 빌더 JPQL: 문자(실행 시점 오류), Querydsl: 코드(컴파일 시점 오류) JPQL: 파라미터 바인딩 직접, Querydsl: 파라미터 바인딩 자동 처리 EntityManager, JPAQueryFactory 모두 동시성 문제가 발생하지 않게 설계가 되어 있다. 따라서 EntityManager 처럼 JPAQueryFactory도 필드 레벨에서 선언하여 사용하여도 문제없다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같..

Spring/Querydsl 2021.06.18

Querydsl 설정

Querydsl을 사용하기 위해선 build.gradle에 설정을 추가해주어야한다.(start.spring.io에 없음 따로 추가해줘야함) Querydsl이 제대로 설정이 되었는지 확인해보기위해서 엔티티를 만들고 Q엔티티가 생성되는지 테스트 엔티티 작성 후 gradle창을 열어 complieQuerydsl 더블클릭하여 컴파일 실행(그냥 build하여도 자동으로 생성됨) build.gradle에 설정해놓은 build폴더의 generated/querydsl 폴더에 엔티티와 동일한 경로로 Q파일 생성 Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다. build 폴더는 gitignore파일로 제외시켜놓았기 때문에 Q타입은 포함하지 않는다. 생성된 QHello.java이다. Q..

Spring/Querydsl 2021.06.17

나머지 기능들

1. Specifications (명세) Spring Data JPA는 JPA Criteria를 활용하여 명세의 개념을 사용할 수 있도록 지원(잘 사용하는 기능아님, 참고용) 명세란 도메인에 관한 규칙을 담는 도메인 객체로 객체가 특정 조건을 만족하는지를 판단하는 역할을 담당한다. 나중에 도메인 주도 설계(DDD)책을 한번 읽어보자!! 사용하고자 하는 곳에서 JpaSpecificationExecutor을 상속받아 사용하면 된다. 해당 인터페이스 내부에 들어가보면 findOne, findAll 등등 여러 메서드를 제공하는데 Parameter로 Specification이란 것을 넘긴다. 술어(predicate) 참 또는 거짓으로 평가 AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성(컴포지트 ..

Spring Data JPA 분석

Spring Data JPA 구현체 분석 공통 인터페이스(JpaRepository)의 구현체 ==> org.sprigframework.data.jap.repository.support.SimpleJpaRepository SimpleJpaRepository 클래스 내에 CRUD를 하는 여러 메서드(save, findAll....)등을 구현해놓았다. SimpleJpaRepository는 @Repository 애노테이션이 붙어있는데 여기에는 두가지 의미가 있다. 1. 컴포넌트 스캔의 대상이 되어 스프링이 읽어 컨테이너에 스프링 빈으로 등록 2. JPA(JDBC도 마찬가지)에서 발생한 예외와 같은 영속성 계층의 예외들을 Spring 예외로 바꿔준다. 서비스 계층이나 컨트롤러 계층에 예외를 넘길 때 JPA나 JD..

확장 기능

1. 사용자 정의 Repository 스프링 데이터 JPA가 제공하는 기능을 사용하기 위해 우리는 JpaRepository 인터페이스를 상속받아 사용하고 구현체는 스프링이 자동으로 생성하여 주입시켜준다. 만약 이를 개발자가 직접 구현하려한다면(implements) 구현해야 하는 메서드들이 굉장히 많기 때문에 매우 번거롭고 까다롭다. 아래와 같은 이유로 만약 인터페이스의 메서드를 직접 구현하려한다면? JPA 직접 사용( EntityManager ) 스프링 JDBC Template 사용 MyBatis 사용 Querydsl 사용 데이터베이스 커넥션 직접 사용 등등... 커스텀 메서드를 딱 하나만 구현하고 싶을 때 사용하는 방법이다. 먼저 커스텀 인터페이스를 만들고 그 안에 메서드를 추가한다. 그 뒤에 인터페이..

JPA Hint, Lock

JPA Hint JPA 쿼리 힌트 ==> SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트 우리가 JPA에서 수정을 위해 사용되는 변경 감지 기능에 대해 먼저 얘기해보자. 위와 같이 변경감지를 사용한다면, 내부적으로 member1을 변경을 감지하기위해 바뀌기 전 데이터와 바뀐 후의 데이터 총 두개를 가지고 있어야한다. 이는 비효율적이다(메모리를 더 잡아먹음). ㅓPA는 엔티티를 영속성 컨텍스트에 보관할 때 최초 상태를 복사해서 저장해두는데 이를 스냅샷 이라 한다. 개발자가 수정을 하길 원하는 것이 아니라 단순히 조회만하여도 JPA는 내부적으로 스냅샷 만들어준다.(변경 감지를 위해) 실제 변경감지 기능을 사용한다면 어쩔 수 없겠지만, 만약 조회만 하고 변경 감지 기능을 사용하지 않는다면 이를 최적화할 ..

반응형