Controller에서 Pageable을 파라미터로 받아 사용하기 위해 import 되어야 할 것은

import org.springframework.data.domain.Pageable;

위의 코드와 같다!!

'Web > Spring' 카테고리의 다른 글

[CRUD] C구현  (0) 2021.08.02
[JPA] 데이터베이스 생성 또는 초기화  (0) 2021.08.02
[ERROR] Querydsl import  (0) 2021.08.02
[Util] ControllerNameInterceptor  (0) 2021.07.30
[배경] Querydsl  (0) 2021.07.28

BooleanBuilder를 찾을 수 없다고 오류가 뜬다. 이 때에는 import를 확인해봐야한다.

import com.querydsl.core.BooleanBuilder;

위와 같이 경로가 정확한지 판단한다!! querydsl에 대한 의존성을 pom.xml에 추가해두지 않으면 임의로 import 하기 때문에 pom.xml 파일을 꼭 확인해보길..

    <!--    Querydsl-->
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <scope>provided</scope>
    </dependency>
    
     <!--      Querydsl-->
      <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <outputDirectory>target/generated-sources/java</outputDirectory>
              <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
          </execution>
        </executions>
      </plugin>

 

❗ Query관련 Domain 설정 또한 의존성이 없으면 maven compile 해도 파일이 자동 생성이 안된다. ❗

'Web > Spring' 카테고리의 다른 글

[JPA] 데이터베이스 생성 또는 초기화  (0) 2021.08.02
[ERROR] Pageable import  (0) 2021.08.02
[Util] ControllerNameInterceptor  (0) 2021.07.30
[배경] Querydsl  (0) 2021.07.28
[배경] JPA  (0) 2021.07.27

이는 front와 연결 짓기 위한 util파일이다.

간단히 설명하면, controller안에 있는 이름을 가져와서 javascript window.controllerName에 집어넣는다.

public class ControllerNameInterceptor extends HandlerInterceptorAdapter {

  @Override
  public void postHandle(HttpServletRequest request, @NonNull HttpServletResponse response,
      Object handler, ModelAndView modelAndView) throws Exception {
    super.postHandle(request, response, handler, modelAndView);

    String controllerName = "";
    String methodName = "";

    if (handler instanceof HandlerMethod) {
      HandlerMethod handlerMethod = (HandlerMethod) handler;
      controllerName = handlerMethod.getBeanType().getSimpleName().replace("Controller", "");
      methodName = handlerMethod.getMethod().getName();
    }

    String queryString = request.getQueryString() != null ? "?" + request.getQueryString() : "";
    request.setAttribute("queryString", queryString);
    request.setAttribute("controllerName", controllerName);
    request.setAttribute("methodName", methodName);
  }
}

위와 같이 util 폴더에 ControllerNameInterceptor.java파일을 만든다.

그 후 아래와 같이 front쪽 스크립트 필요한 곳에 넣어준다.

  • fragments/head.html : 이 파일은 모든 css 파일들을 모아둔 파일이다.
  <script th:inline="javascript">
    /*<![CDATA[*/
    window.contextRoot = /*[[ @{/} ]]*/'/';
    window.controllerName = /*[[ ${controllerName} ]]*/'';
    const numberFormatter = Intl.NumberFormat('en-US');
    /*]]>*/
  </script>

 

 

  • fragments/common-script.html : 이 파일은 모든 js 파일들을 모아둔 파일이다.
  <script th:inline="javascript">
    /*<![CDATA[*/

    var controllerName = /*[[ ${controllerName} ]]*/'';

    $(document).on('click', '.menu', function () {
      window.controllerName = $(this).data('menuname');
    });

    let nav = $('#nav');
    const nav_link = nav.children('a');

    nav_link.each(function (index, el) {
      if ($(el).data('menuname') === controllerName) {
        $(el).addClass('active');
      } else {
        $(el).removeClass('active');
      }
    })


  </script>

위의 코드와 같이 controllerName을 받아올 수 있다.

 

❗ 단, controller폴더 안 파일 이름 설정을 controllerName + Controller라고 정확하게 해줘야한다.

ex) HomeController라고 하면 controllerName은 Home이다! ❗

'Web > Spring' 카테고리의 다른 글

[ERROR] Pageable import  (0) 2021.08.02
[ERROR] Querydsl import  (0) 2021.08.02
[배경] Querydsl  (0) 2021.07.28
[배경] JPA  (0) 2021.07.27
[배경] Maven  (0) 2021.07.27

Querydsl

  • SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
  • 오픈소스
  • 장점
    • 문자가 아닌 코드로 작성
    • 컴파일 시점에 문법 오류를 발견
    • 코드 자동완성(IDE 도움)
    • 동적 쿼리

사용법

1. pom.xml에 dependency 추가

    <!-- Querydsl -->
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <scope>provided</scope>
    </dependency>
 <plugins>
 	<plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
       <configuration>
         <excludes>
           <exclude>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
           </exclude>
         </excludes>
       </configuration>
    </plugin>
    <plugin>
       <groupId>com.mysema.maven</groupId>
       <artifactId>apt-maven-plugin</artifactId>
       <version>1.1.3</version>
       <executions>
         <execution>
           <goals>
             <goal>process</goal>
           </goals>
           <configuration>
             <outputDirectory>target/generated-sources/java</outputDirectory>
             <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
           </configuration>
         </execution>
       </executions>
     </plugin>
</plugins>

 

2. maven lifecycle을 이용해 "clean → compile" 하면 target 폴더 안에 Query Type 생성됨

3. repository/custom 안에 CustomRepository 생성 (Custom____Repository)

4. repository/support 안에 custom을 구현하는 Impl.java 파일 생성 (____RepositoryImpl.java)

5. 기존의 Repository에 CustomRepository를 extends에 추가 (____Repository)

 

❗ 복잡한 쿼리문은 querydsl을 통해서 코드 작성하는 게 보기에도 구현하기에도 편할 것 같다. ❗

❗ querydsl관련 : https://querydsl.com/

 

'Web > Spring' 카테고리의 다른 글

[ERROR] Querydsl import  (0) 2021.08.02
[Util] ControllerNameInterceptor  (0) 2021.07.30
[배경] JPA  (0) 2021.07.27
[배경] Maven  (0) 2021.07.27
[배경] Template Engine  (0) 2021.07.27

Persistence(영속성)

  • 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
  • Object Persistence : 메모리 상의 데이터를 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 영구적으로 저장하여 영속성 부여
  • JDBC, Spring JDBC, Persistence Framework(Hibernate, Mybatis 등)

ORM(Object Relational Mapping)

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것
  • DB 데이터 ← 매핑 → Object 필드
  • Persistant API (JPA, Hibernate 등)

❗ 참고 : https://gmlwjd9405.github.io/2019/02/01/orm.html

JPA(Java Persistence API)

  • Hibernate : ORM 프레임워크, Open Source SW
  • JPA : 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음
    • JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate

JPA의 동작과정

  • JPA는 애플리케이션과 JDBC 사이에서 동작

JPA 사용이유

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 성능 최적화 기능

❗ 참고 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

 

사용법

Dependency추가

<dependency> 
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency> 
<dependency> 
	<groupId>com.h2database</groupId> 
	<artifactId>h2</artifactId> 
</dependency> 
<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-starter-test</artifactId> 
	<scope>test</scope> 
</dependency> 
<dependency> 
	<groupId>org.projectlombok</groupId> 
	<artifactId>lombok</artifactId> 
	<optional>true</optional> 
</dependency>

 

Domain 생성 → Repository 생성 → Service 생성 → Controller 생성

 

properties 설정

<!--application.yml-->
jpa:
    database-platform: kr.co.userinsight.ams.dialect.CustomMariadbDialect
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
    open-in-view: true
<!--application-local.yml-->
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:

 

JpaRepository

(JpaRepository에서 엄청 많은 기능을 제공)

인터페이스를 상속 받아서 사용하면 된다.(extends)

public interface ItemRepository extends JpaRepository<Item, Long> {
    // 비어있음
}

 

 

공통 인터페이스 기능

  • JpaRepository 인터페이스 : 공통 CRUD 제공
  • <엔티티, 식별자>로 설정

 

자주 쓰는 정렬 기능을 위해 Sort 삽입 가능

public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByName(String username, Sort sort);
}

 

추가로 페이징을 위한 기능도 존재

public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findByName(String username, Pageable pageable);
}

 

@Query 어노테이션을 사용해서 직접 JPQL을 지정 가능

public interface MemberRepository extends JpaRepository<Member, Long> {
    
    @Query("select m from Member m where m.username = ?1")
    Member findByUsername(String username, Pageable pageable);
}

 

Web 페이징과 정렬 기능

  • /members?page=0&size=20&sort=name,desc
@RequestMapping(value = "/members", method = RequestMethod.GET)
String list(Pageable pageable, Model mobel) {}

 

 

❗ JPA를 적용하면 개발자는 인터페이스만 만들면 된다. 알아서 동적으로 객체를 생성해서 주입해줌 ❗

❗ JPA의 한계가 존재한다! 따라서 Querydsl도 연동해서 같이 사용한다.. 다음엔 Querydsl을 확인해야지 ❗

'Web > Spring' 카테고리의 다른 글

[Util] ControllerNameInterceptor  (0) 2021.07.30
[배경] Querydsl  (0) 2021.07.28
[배경] Maven  (0) 2021.07.27
[배경] Template Engine  (0) 2021.07.27
[배경] Spring Security  (0) 2021.07.27

"Apache Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다. Apache License로 배포되는 오픈소스 소프트웨어"

 

"필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해 라이브러리들을 자동으로 다운받아준다"

 

장점

  • 라이브러리의 관리를 매우 용이하게 해준다
  • 프로젝트의 작성부터 컴파일, 페트스 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다
  • war파일 기반의 배포용으로도 자주 사용된다

LifeCycle

 

일련의 단계(Phase)에 연계된 Goal을 실행하는 과정 = Build

미리 정의되어있는 Build들의 순서를 LifeCycle이라 한다.

보통 "clean → compile" 순으로 클릭

 

 

 

 

 

❗자세한 내용을 알고 싶으면 https://jeong-pro.tistory.com/168

'Web > Spring' 카테고리의 다른 글

[배경] Querydsl  (0) 2021.07.28
[배경] JPA  (0) 2021.07.27
[배경] Template Engine  (0) 2021.07.27
[배경] Spring Security  (0) 2021.07.27
[배경] Spring 실행 순서  (0) 2021.07.27

+ Recent posts