아직 Jsp를 쓰는 프로젝트에서 Maven multi module 프로젝트를 셋팅했는데, JSP를 못 찾는 문제가 발생했습니다.

IntelliJ Working directory에 $MODULE_WORKING_DIR$ 를 셋팅해주면 문제가 해결됩니다.
- 참고 링크

샘플

그냥하면 에러가 발생하기에 수정이 필요함

-----

 

@ComponentScan(basePackages = {"com.biz"}, includeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)})

//@EnableCaching /* 캐쉬관련 */

//@EnableWebMvc //2020-08-04 기준 spring-admin과 lombok 관련 문제로 EnableWebMvc 사용하면 안됨. 참고: https://github.com/codecentric/spring-boot-admin/issues/777

@Configuration

public class MvcConfiguration implements WebMvcConfigurer {

 

 

   /**

    * spring-admin client에게 요청시 http basic auth로 요청하기 위한 커스텀

    *  - 참고 basic auth 생성기: https://www.blitter.se/utils/basic-authentication-header-generator/

    *

    * @return

    */

   @Bean

   public HttpHeadersProvider customHttpHeadersProvider() {

      return instance -> {

         HttpHeaders httpHeaders = new HttpHeaders();

         httpHeaders.add("Authorization", " Basic 블라블라");

         return httpHeaders;

      };

   }

 

 

}

 

 

메모

 - Spring boot +JSP 사용시 제약이 조금있다. 그래서 가능하면 thymelef 등을 사용하는게 좋음

 - 개인적으로 주변 회사에서는 thymelef를 선호하는 편인듯.. 

 - 나는 Spring boot가 나오기 몇 년전에 FreeMarker를 한참썻는데 이제 쓸데가 없어짐.. 기억도 안나고..(지금 쓰고 있는 JSP도 가능하면 그만 쓰려고 노력 중)



본론으로 들어가서 spring boot 프로젝트의 방향성과 cloud 등에서 embedded servlet container를 선호할수 밖에 없는 제약 등으로 JSP는 이제 그만 사용해야할 듯 함(현재 AWS에서는 JSP를 따로 deploy하고 쓰고 있지만 좋은 방법은 아니고..)



참고


29.4.5 JSP Limitations(링크)

When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations in the JSP support.

  • With Jetty and Tomcat, it should work if you use war packaging. An executable war will work when launched with java -jar, and will also be deployable to any standard container. JSPs are not supported when using an executable jar.
  • Undertow does not support JSPs.
  • Creating a custom error.jsp page does not override the default view for error handlingCustom error pages should be used instead.

There is a JSP sample so that you can see how to set things up.

참고:  https://github.com/spring-projects/spring-loaded

목적: spring boot로 개발 도중에 was 재 시작 없이 작업 중인 소스코드를 적용하여 생산성 향상

 

  1.  springloaded 라이브러리를 maven 디펜더시에 추가 

        <dependency>

            <groupId>org.springframework</groupId>

          <artifactId>springloaded</artifactId>

        </dependency>

  1. springloaded jar파일이 로컬 .m2에 저장됨

    1. ex) C:\Users\{계정명}\.m2\repository\org\springframework\springloaded\1.2.8.RELEASE\springloaded-1.2.8.RELEASE.jar

  2. spring boot의 config에서 VM Arguments에 설정

    1. ex) -javaagent:C:\Users\{계정명}\.m2\repository\org\springframework\springloaded\1.2.8.RELEASE\springloaded-1.2.8.RELEASE.jar -noverify

    2. ex) 샘플 캡쳐

  3. 기타 

    1. 버전 및 파일 path 체크

    2. maven에 추가하지 않고, 해당 jar파일만 다운로드해서 사용해도 무방할 듯(프로젝트에 불필요한 라이브러리가 추가되지 않음)

 

 

 

intellij에서는 아래처럼 셋팅

  1. 현상
    1. 기존 설치형톰캣 + Spring 3.2 기반의 프로젝트를 Spring boot 1.3.5와 임베디드 톰캣으로 변경하였는데 일정 주기마다 응답이 느려지는 현상이 발생(약, 2~3초)
    2. 다른 프로젝트도 Spring boot로 서비스 중이지만 동일현상이 발생하지 않았음
  2. 의심사항 리스트업
    1. 일정주기 -> ehcache 캐쉬 리로드 타임
    2. 로그백 캐쉬 리로드
    3. 기타 여러가지
  3. 디버깅
    1. 테스트용 URL을 만들어서 call 찍어봄
    2. Spring boot tomcat access로그를 남겨서 응답시간을 남겨봄
    3. 어플리케이션 로그를 DEBUG레벨로 남겨봄
  4. 디버깅을 통한 의심사항 확인
    1. 응답이 느려질 때 어플리케이션 로그에 아래와 같은 딜레이가 발생됨을 확인(3초 가량의 딜레이)
    2. 2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [semicolon] has value [-1]
      2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [enc] has value [utf-8]
      2016-07-03 12:22:07 [DEBUG] o.a.c.a.AuthenticatorBase:180 - Security checking request POST 요청URL 블라블라
    3. 해당 시점에 jvm gc를 확인해보니 young gc가 발생 -> GC시점에 느려짐?? -> FULL GC도 아닌데 왜 느려짐? -> 임베디드톰캣 설정이 문제인가??
      1. jstat -gcutil -h10 프로세스ID 1s
      2. 재 확인해보니 꼭 GC발생시점에 느려지지는 않음









파일업로드 Rest full 기능 샘플 소스



@RestController
@RequestMapping ("/file")
public class FileuploadController {

     @Autowired
     private ServletContext context;

     /**
      * 파일 멀티파트 업로드 Rest full
      *
      * @param inputFile
      * @return
      */
     @RequestMapping(value = "/upload", headers = ("content-type=multipart/*" ), method = RequestMethod.POST )
     public ResponseEntity<FileInfo> upload(@RequestParam ("file") MultipartFile inputFile) {

          FileInfo fileInfo = new FileInfo();
          HttpHeaders headers = new HttpHeaders();
           if (!inputFile .isEmpty()) {

               try {

                   String oriFileNm = inputFile.getOriginalFilename();
                   File destinationFile = new File(context.getRealPath("/WEB-INF/uploaded" ) + File.separator + oriFileNm);
                    inputFile.transferTo(destinationFile );
                    headers.add("File Uploaded Successfully - ", oriFileNm);

                    fileInfo.setFileName(destinationFile .getPath());
                    fileInfo.setFileSize(inputFile .getSize());
                    return new ResponseEntity<FileInfo>(fileInfo , headers, HttpStatus.OK );

              } catch (Exception e ) {
                    return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
              }
          } else {
               return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
          }
     }
}




/**
 * 파일정보 VO
 *
 * @author 엄승하
 */
@Data
public class FileInfo {

     private String fileName;
     private long fileSize ;

}





+ Recent posts