Category: Spring Boot

0

Spring Boot - 파일 업로드 2

목차 Spring Boot - StreamingResponseBody Spring Boot - ResourceRegion Spring Boot - 파일 다운로드 서비스 구현하기 Spring Boot - 파일 업로드 서비스 구현하기 Spring Boot - Resource 추상화 Spring Boot - MultipartFile 에서 발생하는 예외 처리 Spring Boot - MultipartFile 를 이용한 파일 업로드 Spring Boot - Part 객체를 이용한 파일 업로드 Spring boot 파일 업로드 2 getHeaderNames() part Type으로 전달된 데이터의 모든 해더 이름을 가져온다. getHeader(headerName) getHeader메소드에 헤더 이름을 넘겨주면 해더 이름이 갖는 요청의 모든 해더 정보를 가져온다. getSubmittedFileName() 파일 명을 가져오기 위한 메소드 getInputStream() Part에 저장된 데이터를 가져오기 위한 메소드 write(filepath) write 메소드에 파일이 저장될 File Path를 입력하면 해당 경로에 파일이 저장하는 메소드 Collection<Part> parts = request.getParts();log.info("parts={}", parts);for (Part part : parts) { log.info("==== PART ===="); log.info("name={}", part.getName()); Collection<String> headerNames = part.getHeaderNames(); for (String headerName : headerNames) { log.info("header {}: {}", headerName, part.getHeader(headerName)); } //편의 메서드 //content-disposition; filename log.info("submittedFilename={}", part.getSubmittedFileName()); log.info("size={}", part.getSize()); //part body size //데이터 읽기 InputStream inputStream = part.getInputStream(); String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("body={}", body); //파일에 저장하기 if (StringUtils.hasText(part.getSubmittedFileName())) { String fullPath = fileDir + part.getSubmittedFileName(); log.info("파일 저장 fullPath={}", fullPath); part.write(fullPath); }} @Slf4j@Controller@RequestMapping("/servlet/v2")public class ServletUploadControllerV2 { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile() { return "upload-form"; } @PostMapping("/upload") public String saveFileV1(HttpServletRequest request) throws ServletException, IOException { log.info("request={}", request); String itemName = request.getParameter("itemName"); log.info("itemName={}", itemName); Collection<Part> parts = request.getParts(); log.info("parts={}", parts); for (Part part : parts) { log.info("==== PART ===="); log.info("name={}", part.getName()); Collection<String> headerNames = part.getHeaderNames(); for (String headerName : headerNames) { log.info("header {}: {}", headerName, part.getHeader(headerName)); } //편의 메서드 //content-disposition; filename log.info("submittedFilename={}", part.getSubmittedFileName()); log.info("size={}", part.getSize()); //part body size //데이터 읽기 InputStream inputStream = part.getInputStream(); String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("body={}", body); //파일에 저장하기 if (StringUtils.hasText(part.getSubmittedFileName())) { String fullPath = fileDir + part.getSubmittedFileName(); log.info("파일 저장 fullPath={}", fullPath); part.write(fullPath); } } return "upload-form"; }}

0

Spring Boot - Part 객체를 이용한 파일 업로드

목차 Spring Boot - StreamingResponseBody Spring Boot - ResourceRegion Spring Boot - 파일 다운로드 서비스 구현하기 Spring Boot - 파일 업로드 서비스 구현하기 Spring Boot - Resource 추상화 Spring Boot - MultipartFile 에서 발생하는 예외 처리 Spring Boot - MultipartFile 를 이용한 파일 업로드 Spring Boot - Part 객체를 이용한 파일 업로드 Spring boot 파일 업로드Form 태그에 enctype 옵션으로 multipart/form-data 를 명시하면 파일을 보낼 수 있다. <form th:action method="post" enctype="multipart/form-data"> <!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head> <meta charset="utf-8"></head><body><div class="container"> <div class="py-5 text-center"> <h2>상품 등록 폼</h2> </div> <h4 class="mb-3">상품 입력</h4> <form th:action method="post" enctype="multipart/form-data"> <ul> <li>상품명 <input type="text" name="itemName"></li> <li>파일<input type="file" name="file" ></li> </ul> <input type="submit"/> </form></div> <!-- /container --></body></html> Part 인터페이스Servlet 에서는 HTTP 멀티파트 요청을 처리하기 위해 Part 인터페이스를 제공합니다. getHeaderNames() part Type으로 전달된 데이터의 모든 해더 이름을 가져온다. getContentType() 파일의 ContentType을 가져온다. getHeader(headerName) getHeader메소드에 헤더 이름을 넘겨주면 해더 이름이 갖는 요청의 모든 해더 정보를 가져온다. getSubmittedFileName() 파일 명을 가져오기 위한 메소드 getInputStream() Part에 저장된 데이터를 가져오기 위한 메소드 write(filepath) write 메소드에 파일이 저장될 File Path를 입력하면 해당 경로에 파일이 저장하는 메소드

0

Spring Boot - Logging 설정

로그 레벨 ERROR > WARN > INFO > DEBUG > TRACE 스프링에서 제공하는 로깅 레벨은 총 5가지 입니다. 로깅 레벨은 ERROR 가 제일 높고 TRACE 가 가장 낮습니다. 로킹 레벨 설정시 현재 레벨이상의 로그 정보를 합께 보여줍니다. 따라서 로그 레벨은 TRACE로 갈 수록 표현되는 Log의 양이 많아지고 ERROR로 갈 수록 표현되는 Log의 양이 적어집니다. Configure 파일 문법Logback Configure파일을 구성하는 3가지 태그가 있다. appender 로그의 출력 위치, 출력 형식및 로깅에 대한 설정(ex. 기간, 용량 등)을 지정한다 root 전역적인 로그 설정을 위해 사용한다. appender를 사용해 appender에 정의된 형식과 위치로 로그를 출력 여러개의 appender를 사용할 수 있다. logger root와는 반대로 class나 Package단위로 Logging 정책을 설정할 수 있다. 로그 메시지를 작성하기 위해 사용하는 클래스를 명시하고 appender를 사용해 appender에 정의된 형식과 위치로 로그를 출력한다. 여러개의 appender를 사용할 수 있다. appender 클래스의 종류

0

Spring Boot - 독립적으로 실행 가능한 JAR

독립적으로 실행 가능한 JAR앱을 어딘가에 배포하거나 도커 이미지로 만들거나 하기 위해서는 jar패키지로 패키징한 후 jar파일을 실행하는게 유용하다. jar파일 생성mvn package mvn pakcage명령어를 통해 앱을 jar파일로 생성한다. jar파일이 생성됨을 확인할 수 있다. jar파일 안에는 앱을 실행하기 위한 의존성(library)들이 전부 다 포함되어 있다. jar 파일 실행java -jar springinit-1.0-SNAPSHOT.jar

0

Spring Boot - 내장 웹 서버 응용 2부(HTTPS와 HTTP2)

내장 웹 서버 응용 2부 : HTTPS와 HTTP2https를 사용하기 위해서는 키스토어가 필요하다. 키스토어 생성# 저는 줄 바꿈 문자 해결 했습니당 ^^keytool -genkey \ -alias tomcat \ -storetype PKCS12 \ -keyalg RSA \ -keysize 2048 \ -keystore keystore.p12 \ -validity 4000 위 명령어를 사용하여 키 스토어를 생성할 수 있다. 키 저장소 비밀번호 입력:새 비밀번호 다시 입력:이름과 성을 입력하십시오. [Unknown]: dongwoo yang조직 단위 이름을 입력하십시오. [Unknown]: island조직 이름을 입력하십시오. [Unknown]: ceo구/군/시 이름을 입력하십시오? [Unknown]: seongbuk시/도 이름을 입력하십시오. [Unknown]: seoul이 조직의 두 자리 국가 코드를 입력하십시오. [Unknown]: krCN=dongwoo yang, OU=island, O=ceo, L=seongbuk, ST=seoul, C=kr이(가) 맞습니까? [아니오]: 예 해당 질문들이 나오는데, 마지막에 “네” 혹은 “yes”를 하게 되면 무한루프에 빠지게 된다….. 예라고 꼭!!!! 적어주도록…. key를 생성하게 된 다음에 git을 사용하고 있는 중이라면 꼭!!! gitignore에 추가하자!!! 키스토어 사용을 위한 세팅해주기

0

Spring Boot - 내장 웹 서버 응용 1부(컨테이너와 포트)

내장 웹 서버 응용 1부 : 컨테이너와 포트https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html에 다른 서블릿 컨테이너를 사용하는 방법이 적혀져 있다. tomcat 빼기 일단, spring-boot-starter-web에 적재되어 있는 tomcat을 뺄 필요가 있다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions></dependency> 톰켓을 뺀 후 아무것도 추가하지 않으면 웹 어플리케이션으로 작동하지 않고 어플리케이션으로 작동하기 때문에 그냥 종료된다. 다른 컨테이너 추가하기Jetty

0

Spring Boot - 내장 웹 서버 이해

내장 웹 서버 이해내장 서버를 스프링 부트 없이 만들어 보기 springbootgetttingstarted public class Application { public static void main(String[] args) throws LifecycleException { // 톰캣 만들기 Tomcat tomcat = new Tomcat(); tomcat.setPort(8888); Context context = tomcat.addContext("/", "/"); // servlet 만들기 HttpServlet servlet = new HttpServlet(){ @Override // get요청에 관한 메소드 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // response 객체의 writer객체를 반환받아 // 응답으로 전해줄 servlet을 작성해준다. PrintWriter writer = resp.getWriter(); writer.println("<html><head><title>"); writer.println("Hey, Tomcat"); writer.println("</title></head>"); writer.println("<body><h1>Hello Tomcat</h1></body>"); writer.println("</html>"); } }; String servletName = "helloServlet"; // 톰켓에 서블릿을 추가해준 후 tomcat.addServlet("/", servletName, servlet); // /hello url과 해당 서블릿을 매핑 시켜준다. context.addServletMappingDecoded("/hello", servletName); tomcat.getConnector(); tomcat.start(); tomcat.getServer().await(); }} tomcat9부터는 tomcat.start()를 하기 전에 tomcat.getConnector()를 해야 실행이 된다. tomcat 객체를 생성 servlet 객체를 생성했다. 결과 스프링 부트에서는 위와 같은 설정을 AutoConfiguration에서 자동으로 잡아준다.

0

Spring Boot - 자동 설정 만들기 1부

자동 설정 만들기 2부EnableAutoConfiguration이 불러오는 같은 Bean 무시하기 maplespringbootstarter 프로젝트 @Configurationpublic class HolomanConfiguration { @Bean @ConditionalOnMissingBean public Holoman holoman(){ Holoman holoman = new Holoman(); holoman.setHowLong(5); holoman.setName("maple"); return holoman; }} @ConditionalOnMissingBean을 사용하면 해당 Bean이 없는 경우에만 EnableAutoConfiguration을 통해 Bean이 추가 된다. 결과2020-03-15 21:31:49.936 INFO 67228 --- [ main] com.example.Application : Starting Application on yangdong-uui-MacBookPro.local with PID 67228 (/Users/dongwoo-yang/dev/study/spring/everyday_spring/chapter3/ch3_5/springbootgettingstarted/target/classes started by dongwoo-yang in /Users/dongwoo-yang/dev/study/spring/everyday_spring/chapter3/ch3_5/springbootgettingstarted)2020-03-15 21:31:49.938 INFO 67228 --- [ main] com.example.Application : No active profile set, falling back to default profiles: default2020-03-15 21:31:50.581 INFO 67228 --- [ main] com.example.Application : Started Application in 0.937 seconds (JVM running for 1.598)Holoman{name='동장군', howLong=60}Process finished with exit code 0 springbootgetttingstarted프로젝트의 Bean이 출력됨을 확인할 수 있다. application.properties를 이용한 방법

0

Spring Boot - 자동 설정 만들기 1부

자동 설정 만들기 1부 Xxx-Spring-Boot-Autoconfigure 모듈: 자동 설정 Xxx-Spring-Boot-Starter 모듈: 필요한 의존성 정의 그냥 하나로 만들고 싶을 때는?Xxx-Spring-Boot-Starter spring-boot-starter 만들기 프로젝트 명 : maplespringbootstarter ArtifactId : maple-spring-boot-starter 의존성 추가 maplespringbootstarter 프로젝트 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure-processor</artifactId> <optional>true</optional> </dependency></dependencies><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>

0

Spring Boot - @SpringBootApplication 알아보기

@SpringBootApplication@SpringBootApplication 은 Spring Boot 애플리케이션의 진입점으로 사용되는 어노테이션으로, Spring Boot 설정 및 실행에 필요한 여러 기능을 한 곳에서 제공합니다. @SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있습니다. @ComponentScan에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration에서 2차적으로 @Bean을 읽어들인다. @SpringBootConfiguration @SpringBootConfiguration은 기존의 Configuration과 비슷하다. @ComponentScan 기본 값은 @SpringBootApplication 가 작성된 패키지와 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다. @EnableAutoConfiguration Spring Boot의 핵심 기능인 자동 설정을 활성화합니다. 라이브러리와 설정을 기반으로 필요한 Bean 들을 설정합니다. 즉 springboot는 Bean을 두번 등록하는 작업을 거친다. @ComponentScan@ComponentScan은 Application.class에 있다. 위 그림에서는 a와 b 패키지의 경우는 ComponentScan의 대상이 되나 maple 패키지의 경우 ComponentScan의 대상이 되지 않는다.

0

Spring Boot의 의존성

Spring Boot의 의존성pom.xml파일에 의존성 추가<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> 스프링이 제공하는 의존성 관리 기능 덕분에의존성 정의시 version을 따로 명시하지 않아도 적절한 version을 가져온다. 의존성 상속 관계spring-boot-starter-parent<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent> spring-boot-dependencies