[μ€νλ§] 2025-07-02
π 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);
}