<form> 속성 : enctype="multipart/form-data"
multipart
기본 양식 content-type
<multipart-config>
<max-file-size>20971520</max-file-size> <!-- 1MB * 20 --> // 한 파일당 최대 올릴 수 있는 용량 설정
<max-request-size>41943040</max-request-size> <!-- 40MB --> //
</multipart-config>




ㄴ 파일명만 전송된 형태

ㄴ 파일명만 전송된 형태




ㄴ 멀티파트 폼 데이터
@PostMapping("/upload")
public String handleFileUpload(@RequestPart("file") MultipartFile file) {
return "Uploaded file: " + file.getOriginalFilename();
}
클라이언트가 파일을 multipart/form-data로 전송하면, 해당 파일이 MultipartFile 객체로 바인딩됩니다.
@PostMapping("/submit")
public String submitData(@RequestPart("info") UserInfo info) {
return "Received user: " + info.getName();
}
public static class UserInfo {
private String name;
private int age;
// getters and setters
}
클라이언트가 info라는 이름으로 JSON 데이터를 전송하면, 이 데이터가 UserInfo 객체로 바인딩됩니다.
@RequestParam은 HTTP 요청의 쿼리 매개변수, 폼 데이터, 또는 URL의 경로 변수 값을 메서드 매개변수로 바인딩할 때 사용됩니다.
사용 상황
@GetMapping("/search")
public String search(@RequestParam("query") String query) {
return "Search results for: " + query;
}
클라이언트가 http://example.com/search?query=spring으로 요청을 보내면, query 매개변수의 값인 "spring"이 메서드의 query 파라미터로 바인딩됩니다.
폼 데이터 처리
@PostMapping("/submit")
public String submit(@RequestParam("name") String name, @RequestParam("age") int age) {
return "Name: " + name + ", Age: " + age;
}
클라이언트가 POST 요청으로 name과 age 값을 전송하면, 해당 값들이 메서드 파라미터로 바인딩됩니다.
@RequestParam(value = "name", required = false, defaultValue = "Guest")데이터의 출처
사용되는 컨텐츠 타입
복잡한 데이터 구조
요약
getBytes() : 파일을 byte형식으로 가져오기getContentType() : 파일 형식getName() : <input type='file' name='이름'> 에서 name값을 가져오는 것getOriginalFilename() : 원래파일명? -> db에 이 이름 사용trasferTo() : 임시폴더나 램에 있는 파일을 실제 파일경로에 옮기기 Interface MultipartFile
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html

ㄴ getBytes() : 파일을 byte형식으로 가져오기
ㄴ getContentType() : 파일 형식

ㄴ 양식에 있는 name값
ㄴ getName() : <input type='file' name='이름'> 에서 name값을 가져오는 것

ㄴ getOriginalFilename() : 원래파일명?


ㄴ trasferTo() : 임시폴더나 렘에 있는 파일을 실제 파일경로에 옮기기




파일업로드 경로가 바귈수 있으니

ㄴ 파일 정적경로 설정함



ㄴ static 형태로 정의 왜...?
ㄴ 플레이스홀더 : 교체하는 방식으로 설정하겠다
ㄴ 설정방식을 의미 : 플레이스 홀더

ㄴ 설정파일 여러개 사용 시 ...짜리 메서드 사용


ㄴ $ 있는 부분 : 플레이스 홀더

ㄴ 주입되는 값 전부 문자열

ㄴ 이 값을

ㄴ 여기 대입





ㄴ 정적경로도 잘 동작함



ㄴ deq(개발시 설정)

ㄴ prod(배포시 설정)
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
<init-param>






ㄴ 근데 매번 xml파일에서 바꿔주는거 넘 비효율적

ㄴ 이거 환경변수 바꿔주는게 더 편함


ㄴ 잘 나옴

ㄴ 이거 문제 있음
ㄴ 해킹의 문제
ㄴ 계정을 공유하는것은 보안적으로 중요하지 않음
ㄴ 내 실제 서버 계정을 올리면 깃허브에 올리면 해킹을 당함
ㄴ 로컬이든 실제 서버계정이든 모든 다 깃헙에 오리면 안됨
ㄴ 절대로 이런 계정을 올리면 안됨
ㄴ 환경변수를 이용하는게 좋음

ㄴ 다시 db설정 돌림
ㄴ db설정은 실행과정중에 설정하는게 좋음
-> 환경변수를 이요하는게 좋음




ㄴ 이런방식으로 해야함
ㄴ db계정은 절대 오픈소스에 올리면 안됨
예시)

ㄴ 이거 이대로 올리면 맥(리눅스)은 오류 뜸
ㄴ + 나 노트북에 d드라이브 없는데
ㄴ 근데 이 설정을 가지고 다같이 작업해야하는데 누구는 맥이고 누구는 윈도우이면 우짬
ㄴ 다들 설정이 다르다 -> 그럼 환경변수에 따라 설정을 다르게 적용해줘야지
ㄴ 프로파일 통해 설정 분리하자

ㄴ 프로파일 통해 설정파일 분리함

ㄴ 이런식으로



ㄴ 설정 2개 생성

ㄴ 설정파일에 따라 다르게 업로드됨


ㄴ uploads1이 아닌 uploads2 에 생성된 모습 쳌

ㄴ 이거 는 개발환경마다 다르니 깃 이그노어해야함
ㄴ 안그럼 다른 사람 작업 망가짐...
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations(
new ClassPathResource("db.properties"),
new ClassPathResource("info.properties"));
return configurer;
}
