๐ file.upload-dir=uploads/ ์๋ฏธ
์ด ์ค์ ์ ํ์ผ ์ ๋ก๋๋ฅผ ์ํ ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ์ฌ์ฉ์ ์ ์ ํ๋กํผํฐ์ด๋ค.
๐ ๏ธ ์ฌ์ฉ ์์
๐ application.properties
file.upload-dir=uploads/
- file.upload-dir์ Spring Boot์์ ์ง์ ์ ๊ณตํ๋ ๊ณต์ ํค๋ ์๋๊ณ , ๊ฐ๋ฐ์๊ฐ ์ปค์คํ ํด์ ์ฌ์ฉํ๋ ํค์ด๋ค.
- uploads/๋ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ์ง์ ๋ ๊ฒฝ๋ก ๊ธฐ์ค์ผ๋ก ํ์ผ์ ์ ์ฅํ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก์ด๋ค. (์๋ ๊ฒฝ๋ก)
๐ Java ์ฝ๋ (์: @Value ์ฌ์ฉ)
@Value("${file.upload-dir}")
private String uploadDir;
- Java ์ฝ๋์์ @Value๋ก ์ฃผ์ ๋ฐ์ ํ์ผ ์ ์ฅ ๊ฒฝ๋ก๋ก ์ฌ์ฉํ๋ค.
๐ ํ์ผ ์ ์ฅ ๋ก์ง
Path filePath = Paths.get(uploadDir + filename);
Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);
์ด๋ ๊ฒ ํ๋ฉด uploads/ ํด๋ ์๋์ ์ ๋ก๋๋ ํ์ผ์ด ์ ์ฅ๋๋ค.
โ ๏ธ ์ฃผ์์ฌํญ
- uploads/ ๋๋ ํ ๋ฆฌ๊ฐ ์๋ฒ ์คํ ์ ์ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์๋ฒ ์คํ ์ ์๋ ์์ฑํ๊ฑฐ๋, ์๋์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
Files.createDirectories(Paths.get(uploadDir));
- ์๋ ๊ฒฝ๋ก(uploads/)๋ ํ์ฌ ์คํ๋๋ ์์น ๊ธฐ์ค์ด๋ค. ์๋ฅผ ๋ค์ด, Spring Boot๋ฅผ build/libs ์๋ JAR๋ก ์คํํ๋ฉด uploads/๋ ๊ฑฐ๊ธฐ์ ๋ง๋ค์ด์ง๋ค.
โ @Controller๋?
Spring์์ Controller๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ๋ฐํํ๋ ํต์ฌ ์ปดํฌ๋ํธ์ด๋ค. ์ฝ๊ฒ ๋งํด, ๋ธ๋ผ์ฐ์ ์ฑ์์ ๋ณด๋ธ ์์ฒญ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello.html";
}
}
- @Controller๋ Spring MVC์ ์ปจํธ๋กค๋ฌ์์ ์ ์ธํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
- ์ฃผ๋ก ๋ทฐ(View)๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉ๋๋ค.(HTML, JSP ๋ฑ)
- return ๊ฐ์ ํ ํ๋ฆฟ ํ์ผ๋ช (์ : hello.html)
โ @RestController๋?
@RestController
public class ApiController {
@GetMapping("/api/greet")
public String greet() {
return "Hello, API!";
}
}
- @RestController๋ @Controller + @ResponseBody์ ์กฐํฉ์ด๋ค.
- ์ฆ, ๋ทฐ๋ฅผ ๋ฐํํ๋ ๊ฒ ์๋๋ผ JSON/XML ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฐํํ๋ค.
- ๋ฐฑ์๋ API ์๋ฒ์์๋ ๊ฑฐ์ ๋๋ถ๋ถ @RestController๋ฅผ ์ฌ์ฉํ๋ค.
๐ ์์ฒญ ๋งคํ ์ด๋ ธํ ์ด์
์ด๋ ธํ ์ด์ | ์ค๋ช |
@GetMapping | GET ์์ฒญ ์ฒ๋ฆฌ (์ : ์กฐํ) |
@PostMapping | POST ์์ฒญ ์ฒ๋ฆฌ (์ : ๋ฑ๋ก) |
@PutMapping | PUT ์์ฒญ ์ฒ๋ฆฌ (์ : ์์ ) |
@DeleteMapping | DELETE ์์ฒญ ์ฒ๋ฆฌ (์ : ์ญ์ ) |
@RequestMapping | ์ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ผ๋ฐํ (GET/POST ๋ฑ ์ง์ ๊ฐ๋ฅ) |
๐ฅ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ
@GetMapping("/user")
public String getUser(@RequestParam String name) {
return name + "๋ ์๋
ํ์ธ์!";
}
- @RequestParam : ์ฟผ๋ฆฌ ์คํธ๋ง(?name = ์ด๋ฆ)
- @PathVariable : URL ๊ฒฝ๋ก์ ์ผ๋ถ (/user/{id}
- @RequestBody : JSON ์์ฒญ ๋ณธ๋ฌธ ํ์ฑ (์ฃผ๋ก POST/PUT)
๐ค ์๋ต ๋ฐํ ๋ฐฉ์
๋ฐฉ์ | ์ค๋ช |
๋ฌธ์์ด ๋ฐํ (String) | ๋ทฐ ์ด๋ฆ (ํ ํ๋ฆฟ ํ์ผ) ํน์ ๋ฉ์์ง |
ResponseEntity<T> | HTTP ์ํ ์ฝ๋์ ํจ๊ป ์๋ต |
@ResponseBody | JSON ํ์์ผ๋ก ๋ฐ๋ก ๋ฐํ |
Controller - Service - Repository ๊ตฌ์กฐ
์ด ํจํด์ Spring์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ ์ด์ด๋ ์ํคํ ์ฒ(Layered Architecture)์ด๋ค. ์ด ๊ตฌ์กฐ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ(Separation of Concerns) ์์น์ ์ ์งํค๊ฒ ํด์ค์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
์ด๋ ๊ฒ ๋๋๋ ์ด์ ๋?
- Controller : ์น ์์ฒญ ์ฒ๋ฆฌ์๋ง ์ง์ค
- Service : ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ๋ถ๋ฆฌ
- Repository : ๋ฐ์ดํฐ ์ฒ๋ฆฌ์๋ง ์ง์ค
โก ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธ๊ฐ ์ฌ์์ง๊ณ , ๋ณ๊ฒฝ์ ์ ์ฐํ๋ฉฐ, ํ์ ์ ์ญํ ์ด ๋ช ํํด์ง๋ค.
๐ ์ ์ฒด ๊ตฌ์กฐ ๊ทธ๋ฆผ
1๏ธโฃ Controller
์ญํ
- HTTP ์์ฒญ์ ๋ฐ๊ณ , ์๋ต์ ๋ฐํํ๋ค.
- ํด๋ผ์ด์ธํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณ์ธต์ด๋ค.
- ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ๊ณ , ์๋น์ค์ ์ ๋ฌํ๋ค.
โป ํ์ฑ (Parsing : ๊ตฌ๋ฌธ๋ถ์) ์ ํ๋์ ํ๋ก๊ทธ๋จ์ ๋ฐํ์ํ๊ฒฝ (์๋ฅผ ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๋ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง)์ด ์ค์ ๋ก ํํ ์ ์๋ ๋ด๋ถ ํฌ๋งท์ผ๋ก ๋ถ์ํ๊ณ ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์์
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping
public ResponseEntity<User> create(@RequestBody UserDto dto) {
return ResponseEntity.ok(userService.createUser(dto));
}
}
2๏ธโฃ Service
์ญํ
- ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
- ํธ๋์ญ์ ์ฒ๋ฆฌ, ์ฌ๋ฌ ์ํฐํฐ ๊ฐ์ ์ฐ์ฐ ๋ฑ์ ๋ด๋นํ๋ค.
- Controller์ Repository์ ์ค๊ฐ๋ค๋ฆฌ ์ญํ .
์์
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(UserDto dto) {
User user = new User(dto.getName(), dto.getEmail());
return userRepository.save(user);
}
}
3๏ธโฃ Repository
์ญํ
- DB์ ์ค์ ๋ก ์ ๊ทผํ๋ค. (Insert, Select, Update, Delete)
- Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ JpaRepository๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ๋ค.
์์
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[H2 DB] ์์ ์ญ์ ํ ์ฌ์ค์น ๋ฐฉ๋ฒ(Spring Boot ํ๋ก์ ํธ ํ๋ฉด์ ์๊ธด ๋ฌธ์ ) (0) | 2025.02.04 |
---|---|
[TIL] 2024๋ 11์ 14์ผ (1) | 2024.11.15 |
[TIL] 2024๋ 11์ 11์ผ (1) | 2024.11.12 |
[TIL] 2024๋ 11์ 10์ผ (0) | 2024.11.11 |
[TIL] 2024๋ 11์ 09์ผ (0) | 2024.11.10 |