@Repository
@Transactional
public interface EmployeeDAO extends JpaERepository<Employee, Integer> {
// 1. Spring JPA In Cause using method name
List<Employee> findByEmployeeNameIn(List<String> names);
// 2. Spring JPA In cause using @Query
@Query("SELECT e FROM Employee e WHERE e.employeeName IN (:names)")
List<Employee> findByEmployeeNames(@Param("names") List<String> names);
// 3. Spring JPA In cause using native query
@Query(nativeQuery = true, value = "SELECT * FROM Employee as e WHERE e.employeeName IN (:names)")
List<Employee> findByEmployeeName(@Param("names") List<String> names);
}
2. Spring JPA query NOT IN clause example
@Repository
@Transactional
public interface EmployeeDAO extends JpaRepository<Employee, Integer> {
// 1. Spring JPA In cause using method name
List<Employee> findByEmployeeNameNotIn(List<String> names);
// 2. Spring JPA In cause using @Query
@Query("SELECT e FROM Employee e WHERE e.employeeName NOT IN (:names)")
List<Employee> findByEmployeeNamesNot(@Param("names") List<String> names);
// 3. Spring JPA In cause using native query
@Query(nativeQuery = true, value = "SELECT * FROM Employee as e WHERE e.employeeName NOT IN (:names)")
List<Employee> findByEmployeeNameNot(@Param("names") List<String> names);
}
3. Spring JPA dynamic IN Query
public List<Employee> findByInCriteria(List<String> names) {
return employeeDAO.findAll(new Specification<Employee>() {
@Override
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (names != null && !names.isEmpty()) {
predicates.dd(root.get("employeeName").in(names));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
});
}
}
4. Spring JPA dynamic NOT IN Query
public List<Employee> findByInCriteria(List<String> names) {
return employeeDAO.findAll(new Specification<Employee>() {
@Override
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (names != null && @!names.isEmpty()) {
predicates.add(criteriaBuilder.not(root.get("employeeName").in(names)));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
});
}
Spring Boot에서는 default context path를 / 로 설정한다. 대부분의 웹서버, WAS, 혹은 Spring boot의 내장 서버 역시 다 root 를 기본으로 가지고 있다. 즉, 로컬 개발시, http://localhost:8080/ 과 같은 주소가 되는 것이다. 그리고 각 controller에서 설정한 Request Mapping 정보에 따라서 그 하위 경로가 생성된다.
그런데 경우에 수정해야 하는 경우가 있다. 물론 그에 따른 loadbalancing이나 gateway 역할은 다른 서버가 할 수도 있지만, 하나의 프로그램 단위별로 최상의 경로를 다르게 명명하는 경우도 있다. 이것 역시 설정 파일인 application.yml에 설정하게 된다.
Property 조정으로 설정
application.properties 파일을 수정하여 적용하는 것이 가장 효율적인 적용 방법이다. 다른 여러가지 방법이 있고, Spring의 기본 개게를 상속(구현)하여 적용하는 방법 역시 가능하다. 하지만 Spring Boot는 application.properties 파일을 통한 설정 변경을 권장하고 있고, 더욱 상세한 설정이나 properties 파일로 적용되지 않는 사항을 제외하고는 가급적이면 properties 파일을 수정하여 적용하는 것을 권장한다.
다른 설정들처럼, SpringBoot에서는 property 파일을 통해 이를 설정할 수 있다. server.servlet.context-path 이다.
* application.properties / yml 파일 수정하여 적용하기
server.servlet.context-path=/jiyoon
스프링 프로젝트를 재실행하면 http://localhost:8080/jiyoon 를 통해서만 접속되는 것을 확인할 수 있다.
* Java System Property 이용하기
Java System Property(환경변수)를 이용할 수도 있다. 이 방식을 사용하여면 context가 초기화되기 전에 넣어준다.
생성한 프로젝트의 시작 class 가 되는 {프로젝트명}Application.java 파일을 열어 main() 함수를 찾습니다. 이 곳이 프로젝트 구동의 시작점이 되는 곳이므로 아래와 같은 내용을 추가해주면 된다. 환경변수를 설정하는 것인데, java -jar 명령어와 함께 환경변수를 넣어주는 것과 동일한 효과를 갖습니다.
위 예제에서 SpringApplication.run() 부분이 실제 서버가 구동되기 시작하는 부분이므로 그보다 앞에 작성해야 한다.
* OS 환경 변수 이용
Spring Boot는 시스템의 환경변수를 사용할 수 있다. 이는 앞서 설명한 System.setProperty()에서 설정하는 것과 동일한 효과를 갖는다. 원하는 형태로 변경해서 진행해도 되지만, 하나의 시스템에 여러 개의 어플리케이션을 구동하는 경우에는 정상적으로 구동되지 않을 수 있다.
Unix 기반 시스템에서는 다음을 입력해 환경 변수를 설정해준다. 이 명령을 입력한 창을 닫지 않고 세션을 그대로 둔 채로 프로그램을 구동해야 한다.
$ export SERVER_SERVLET_CONTEXT_PATH=/jiyoon
윈도우 환경이면 아래처럼 입력한다.
> set SERVER_SERVLET_CONTEXT_PATH=/jiyoon
* Command line에서 설정하기
Spring Boot를 실행하는 명령어 상에서 argument로 설정할 수 있다. 실제 운영에서 이렇게 사용하기보다는 특정 상황에 따라 가변적으로 적용해야 하는 경우에만 임시로 사용하기를 권장한다.
ssh 원격 접속 프로토콜을 기반으로 Secure Copy의 약자로 원격지에 있는 파일과 디렉터리를 보내거나 가져올 때 사용하는 파일 전송 프로토콜이다. 네트워크가 연결되어 있는 환경에서 ssh와 동일한 22번 포트와 identity file을 사용해서 파일을 송수신하기 때문에 보안적으로 안정된 프로토콜이다.
댓글 개