공공데이터포털
https://www.data.go.kr/
한국환경공단_에어코리아_대기오염정보
한국환경공단_에어코리아_미세먼지 경보 발령 현황
@PostMapping("/fileUp")
public String fileUp(@RequestParam("fileUp") MultipartFile file) {
System.out.println(file.getName());
System.out.println(file.getSize());
System.out.println(file.getOriginalFilename());
return "redirect:/fileUp";
}
결과
MultipartProperties의 max-file-size, max-request-size
프로퍼티 설정
application.properties
#fileUp
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=50MB
spring.servlet.multipart.enabled=true
한 파일당 10MB까지
여러 파일이면 최대 50MB까지
마지막줄은 서블릿 자체에서 파일 업로드를 처리하겠느냐?라는 말이라는 것 같다,,(잘못들으뮤)
-> 서버 용량..? 때문에 최소한으로 하는 경우 많지만 요즘 주고받는 파일 크기가 커서 이렇게 한다고 하심.
Spring io - Uploading Files 가이드
경로 찾기
@PostMapping("/fileUp")
public String fileUp(@RequestParam("fileUp") MultipartFile file) {
System.out.println(file.getName());
System.out.println(file.getSize());
System.out.println(file.getOriginalFilename());
String url = util.req().getServletContext().getRealPath("/upload");
System.out.println(url);
return "redirect:/fileUp";
}
경로.. 결과
C:\Users\user\AppData\Local\Temp\tomcat-docbase.80.7617319354238946288\upload
@PostMapping("/fileUp")
public String fileUp(@RequestParam("fileUp") MultipartFile file) {
System.out.println(file.getName());
System.out.println(file.getSize());
System.out.println(file.getOriginalFilename());
String url = util.req().getServletContext().getRealPath("/upload");
File upFileName = new File(new File(url), file.getOriginalFilename());
try {
file.transferTo(upFileName);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
System.out.println("실제 경로: " + url);
return "redirect:/fileUp";
}
이러면 아직 실제로 폴더 없어서 안된다고 만들어줘야한다
@PostMapping("/fileUp")
public String fileUp(@RequestParam("fileUp") MultipartFile file) {
System.out.println(file.getName());
System.out.println(file.getSize());
System.out.println(file.getOriginalFilename());
//String url = util.req().getServletContext().getRealPath("/upload");
File url = new File(util.req().getServletContext().getRealPath("/upload"));
url.mkdirs();
File upFileName = new File(url, file.getOriginalFilename());
try {
file.transferTo(upFileName);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
System.out.println("실제 경로: " + url);
return "redirect:/fileUp";
}
String이던 url을 File 타입으로 만들어야
.mkdirs()
를 쓸 수 있다.
매우 간단하게 만들고 있는 파일 업로드
@PostMapping("/fileUp")
public String fileUp(@RequestParam("fileUp") MultipartFile file) {
System.out.println(file.getName());
System.out.println(file.getSize());
System.out.println(file.getOriginalFilename());
//String url = util.req().getServletContext().getRealPath("/upload");
File url = new File(util.req().getServletContext().getRealPath("/upload"));
url.mkdirs();
//UUID 붙이든... -> 다운받으면 원래 파일명 복원해주는 걸로
//연월일시분초
//나노초
//파일 업로드시 UUID+실제파일명.확장자
//파일 다운로드시 원래 파일명.확장자 ---------
//UUID
UUID uuid = UUID.randomUUID();
System.out.println("원본 파일명: " + file.getOriginalFilename());
System.out.println("UUID 파일명: " + uuid.toString() + file.getOriginalFilename());
//날짜 뽑아서 파일명 변경하기
LocalDateTime ldt = LocalDateTime.now();
String ldtFormat = ldt.format(DateTimeFormatter.ofPattern("YYYYMMddHHmmSS"));
System.out.println("날짜 파일명: " + ldtFormat + file.getOriginalFilename());
File upFileName = new File(url, file.getOriginalFilename());
try {
file.transferTo(upFileName);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
System.out.println("실제 경로: " + url);
return "redirect:/fileUp";
}
@ResponseBody
의 위치
이것도 있고
저번 ajax rest처럼 method signature 라인 안에 쓰는 것도 있었다,,
//downfile@파일명
@ResponseBody
@GetMapping("/downfile@{file}") //path variable
public void down(@PathVariable("file") String file, HttpServletRequest request, HttpServletResponse response) {
System.out.println("경로에 들어온 파일명 : " + file);
String url = "/img/"; //url 포함 경로 (+file 해주면 겹침)
File serverFile = new File(url, file); //다운받을 경로,,?
//바이트배열로 선언해줌
try {
byte[] fileByte = FileCopyUtils.copyToByteArray(serverFile);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; fileName=\""+URLEncoder.encode(url+file, "UTF-8")+"\";");
response.setHeader("Content-Transfer-Encoding", "binary");
response.getOutputStream().write(fileByte);
response.getOutputStream().flush(); // 남아있는 것들 다 전송해
response.getOutputStream().close(); // stream 통해서 내보내기.
} catch (IOException e) {
e.printStackTrace();
}
}
=> 잘 안돼서 변경 static 폴더 접근이 안됐다,, (application.properties에서 접근 가능하게 설정해주면 할수있다고 한다.)
[Spring Boot] 정적자원(Static Resources, img; js; css 파일 등)에 대한 접근 설정
업로드 했던 거 그대로 다운하게
//downfile@파일명
@ResponseBody
@GetMapping("/downfile@{file}") //path variable
public void down(@PathVariable("file") String file, HttpServletRequest request, HttpServletResponse response) {
System.out.println("경로에 들어온 파일명 : " + file);
//String url = "/img/"; //url 포함 경로 -> 안돼서
//파일업로드때 경로
File url = new File(util.req().getServletContext().getRealPath("/upload"));
File serverFile = new File(url, file);
//다운받을 경로,,?
//바이트배열로 선언해줌
try {
byte[] fileByte = FileCopyUtils.copyToByteArray(serverFile);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; fileName=\""+URLEncoder.encode(url+file, "UTF-8")+"\";");
response.setHeader("Content-Transfer-Encoding", "binary");
response.getOutputStream().write(fileByte);
response.getOutputStream().flush(); // 남아있는 것들 다 전송해
response.getOutputStream().close(); // stream 통해서 내보내기.
} catch (IOException e) {
e.printStackTrace();
}
}
다운받을 때는 브라우저에서 url @뒤에 파일이름을 올린 걸로 변경
gradle tasks
build - bootJar 우클릭, run
이러고
워크스페이스에 프로젝트 폴더
/build/libs 안에
cmd에서
저 .jar 경로에 찾아가서 아래 명령어 실행
java -jar web-0.0.1-SNAPSHOT.jar
그러면 스프링 프로젝트가 실행된다.
레거시때와의 차이점을 느껴보자(톰캣 내장이라 그냥 실행 -> 편리)
wsl 폴더에 jar 파일 집어넣으면 실행되는데
펭귄모양 wsl 폴더가 안보인다,,
wsl 실행
explorer.exe .
이 명령어로 루트 폴더를 열어준다.
아까 jar를 넣어준다.
리눅스 자바 설치 명령어(java 버전이 안 맞다)
모르니까 찾는다
sudo apt search jdk-17
정확히 알고 있으면 바로 install
sudo apt install
오라클 jdk는 설치 못함. openjdk 계열만 가능하다.
자바를 삭제한다.
sudo apt remove openjdk*
y로 continue하면 톰캣도 없어짐.
java가 사라진 모습
얘 설치
sudo apt install openjdk-17-jre-headless
나는 됨
안되는 경우 이렇게 해본다
sudo apt update
sudo apt upgrade
sudo apt install openjdk-17-jre-headless
이제 실행
java -jar web-0.0.1-SNAPSHOT.jar
끌 때는 Ctrl
+C
DB 문제...
테이블명 db명 같다면 일단 선생님꺼 디비로
59~
build.gradle
implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
dependencies에 추가
util 패키지에 SwaggerConfig.java 클래스 파일을 만들어준다.
애너테이션은
@Configuration
, @EnableSwagger2
import springfox.documentation.service.Parameter;
이쪽의 Parameter
package com.apple.web.util;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private static final String API_NAME = "Spring boot API";
private static final String API_VERSION = "1.0";
private static final String API_DESCRIPTION = "스프링 부트 API 명세서";
@Bean
public Docket api() {
Parameter parameter = new ParameterBuilder() // API에 전역 파라미터를 설정
.name(HttpHeaders.AUTHORIZATION)
.description("token")
.modelRef(new ModelRef("model"))
.parameterType("")
.required(false).build(); // 이런 객체 생성
List<Parameter> paramList = new ArrayList<Parameter>();
paramList.add(parameter);
return new Docket(DocumentationType.SWAGGER_2).
globalOperationParameters(paramList).
apiInfo(apiInfo()). // api이름을 아래 메소드에서 설정합니다. = 정보
select().
apis(RequestHandlerSelectors.basePackage("com.apple.web")). // 스웨거를 적용할 클래스 패키지
paths(PathSelectors.any()). // 위 패키지 하위의 모든 패키지를 적용합니다.
build();
}// end api
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(API_NAME)
.version(API_VERSION)
.description(API_DESCRIPTION)
.build();
}
}
안된다...
1) SpringBoot 버전을 이전 버전인 2.7로 다운그레이드한다.
2) 새 버전의 Swagger을 기다려야한다.
3) springdoc-openapi를 사용한다.
SpringBoot 3.x 버전 이상 프로젝트에 Swagger 적용 오류 해결 및 springdoc-openapi 적용
SpringBoot + SpringSecurity 프로젝트에 Swagger 3.0 적용하기
지금은 swagger 날린다.
프로젝트때 GIS랑 버전 안 맞으면 뭐든 안될 수 있다...
메뉴를 만들고 APIController 생성
사용할 API 상세정보를 보면 예시 코드까지 다 있다
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861
url은 요청주소
serviceKey는 마이페이지 개인키 (encode된거)
그 외 요청 변수... 다 추가
URL url = new URL(urlBuilder.toString());
얘는
throws MalformedURLException
throw한다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
여기도 하면 throws IOException
이 된다.
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode()); // 접속 결과. 200대가 정상 접속.
흐흐흑