TIL

[μŠ€ν”„λ§] 2025-07-02

dev슀카이 2025. 7. 2. 21:27

πŸ“ 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);
}