분류 전체보기 13

서비스계층과 DTO

DTO는 Data Transfer Object의 약자입니다. 엔티티 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념입니다. 순수하게 데이터를 담고 있다는 점에서 엔티티 객체와 유사하지만 목적 자체가 데이터의 전ㄷ라이므로 읽고, 쓰는 것이 모두 허용되는 점, 일회성으로 사용되는 성격이 강합니다. JPA를 이용하게 되면 엔티티 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련이 있고 내부적으로 엔티티 매니저가 관리하는 객체입니다. DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 달리 Life cycle도 전혀 다르기 때문에 분리해서 처리하는 것을 권장합니다. 웹 애플리케이션을 제작할 때 HttpServlerRequest 또는 HttpServlerResponse를 서비스 ..

Spring + Boot 2021.04.21

JPA와 Entity , 동적 쿼리 처리를 위한 Querydsl 설정

Entity 클래스에 @MappedSuperClass라는 어노테이션을 적용하면 테이블로 생성되지 않습니다. 실제 테이블은 Entity클래스를 상속한 엔티티의 클래스로 데이터베이스 테이블이 생성됩니다. JPA는 JPA만의 고유한 메모리공간(context)을 이용해서 엔티티 객체들을 관리합니다. 기존의 Mybatis 기반의 프로그램과 달리 단계가 하나 더 있는 방식입니다. Mybatis를 이용하는 경우 SQL을 위해 전달되는 객체는 모두 SQL 처리가 끝난 뒤 어떻게 되든 상관없는 객체들인 반면에 JPA에서 사용하는 엔티티 객체들은 영속 콘텍스트라는 곳에서 관리되는 객체입니다. 이 객체들이 변경되면 결과적으로 데이터베이스에 이를 반영하는 방식입니다. JPA에서는 해당 엔티티 객체는 유지되고 필요할 때 꺼내서..

Spring + Boot 2021.04.18

Spring Security 연동하기 -2 (CSRF를 곁들인)

Authorization 필요한 리소스 설정 스프링 시큐리티를 이용해서 특정한 리소스 (자원-웹의 경우 특정한 URL)에 접근 제한을 하는 방식은 대표적으로 설정을 통해서 패턴을 지정하거나 어노테이션을 이용해서 적용하는 방법이 있습니다. SecurityConfig 클래스에 다음과 같이 추가합니다. @Override protected void configure(HttpSecurity http) throws Exception{ http.authorizeRequests() .antMatchers("/sample/all").permitAll(); } http.authorizeRequests()로 인증이 필요한 자원들을 설정할 수 있고, antMatchers()는 **/*와 같은 앤트 스타일의 패턴으로 원하는 자..

Spring + Boot 2021.04.16

Spring Security 연동하기 -1

프로젝트 생성할 때 Spring Security 항목을 추가해서 생성해줍니다. build.gradle에 다음과 같이 추가해주세요 dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:..

Spring + Boot 2021.04.15

Thymeleaf 시작하기 반복문, 제어문, 인라인 속성, 링크 처리

Thymeleaf는 JSP를 사용해봤다면 어려움없이 적응 가능합니다. 먼저 SampleDTO 클래스를 만들어주세요 import lombok.Builder; import lombok.Data; import java.time.LocalDateTime; @Data @Builder(toBuilder = true) public class SampleDTO { private Long sno; private String first; private String last; private LocalDateTime regTime; } Lombok의 @Data는 Getter/Setter, toString(), equals(), hashCode()를 자동으로 생성합니다. SampleController클래스에 작성해준 Sampl..

Thymeleaf 2021.04.13

JPA 쿼리 메서드 기능 @Query

특정한 범위의 객체를 검색하거나 like 처리, 여러가지 검색 조건이 필요하다면? 쿼리 메서드 : 메서드의 이름 자체가 쿼리 구문으로 처리되는 기능 @Query : SQL과 유사하게 엔티티 클래스의 정보를 이용하여 쿼리를 작성하는 기능 Querydsl 등의 동적 쿼리 처리 기능 쿼리 메서드는 메서드의 ㅇ이름 자체가 Query문이 되는 기능입니다. findBy나 getBy로 시작하며 필요한 필드 조건이나 And, Or 키워드를 이용해서 조건을 만들어냅니다. 쿼리 메서드는 사용하는 키워드에 따라서 파라미터의 개수가 결정됩니다. 리턴 타입도 상당히 자유롭습니다. Select를 하는 작업이라면 List 타입이나 배열을 이용할 수 있고 파라미터에 Pageable 타입을 넣는 경우 무조건 Page 타입입니다. im..

Spring + Boot 2021.04.08

JPA 페이징 / 정렬 처리하기

오라클에서는 인라인뷰를, MySQL에서는 limit을 사용하여 페이징 처리를 했지만 JPA는 Dialect를 이용해서 처리합니다. JPA가 실제 데이터베이스에서 사용하는 SQL의 처리를 자동으로 하기 때문에 개발자들은 SQL이 아닌 API의 객체와 메서드를 사용하는 방식으로 페이징 처리를 할 수 있게 되었습니다. 페이징처리와 정렬은 findAll() 이라는 메서드를 사용합니다. JpaRepository 인터페이스의 상위인 PagingAndSortRepository의 메서드로 파라미터로 전달되는 Pageable이라는 타입의 객체에 의해 실행되는 쿼리를 결정하게 됩니다. 리턴 타입을 Page로 지정했을 경우 반드시 파라미터를 Pageable타입을 사용해야 합니다. 페이지 처리를 위해 가장 중요한 것은 org..

Spring + Boot 2021.04.08

JPA 조회 / 수정 / 삭제 테스트

@Test public void testSelect(){ Long mno = 100L; Optional result = memoRepository.findById(mno); System.out.println("=========================================="); if(result.isPresent()){ Memo memo = result.get(); System.out.println(memo); } } 조회 테스트는 findById()나 getOne()을 이용해서 엔티티 객체를 조회할 수 있습니다. findById()와 getOne()은 동작하는 방식이 다른데 데이터베이스를 먼저 이용하는지, 나중에 필요한 순간까지 미루는 방식을 이용하는지에 대한 차이가 있습니다. findBy..

Spring + Boot 2021.04.08

JpaRepository / JPA로 CREATE, INSERT 해보기

insert : save(entity 객체) select : findById(키 타입), getOne(키 타입) update : save(entity 객체) delete : deleteById(키 타입), delete(엔티티 객체) insert와 update작업에 사용하는 메서드가 동일하게 save()를 이용하는데 JPA의 구현체가 메모리상에서 객체를 비교하고 없다면 insert, 존재하면 update를 동작시키는 방식이기 때문입니다. 이제 아래처럼 MemoRepository 인터페이스를 만들어 줍니다. import org.springframework.data.jpa.repository.JpaRepository; import org.zerock.ex2.entity.Memo; public interface..

Spring + Boot 2021.04.07