๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/Tech Basics

5์ผ์ฐจ. IT ๊ฐœ๋… ์ •๋ฆฌ

by GreenJin_S2 2025. 10. 15.

IT ๊ฐœ๋… ์ •๋ฆฌ (ํ•ต์‹ฌ ๊ฐœ๋…:์ฒ ํ•™, DTO/VO, ๊ณ„์‚ฐ๊ธฐ ๊ตฌํ˜„)

1. ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค vs ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค: ์„ธ์ƒ์€ ๋ณ€ํ•˜๋ƒ, ์•ˆ ๋ณ€ํ•˜๋ƒ? ๐Ÿ”ฅ

  • ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค: ๋ชจ๋“  ๊ฑด ๋ณ€ํ•œ๋‹ค! (Variable) ๐ŸŒŠ
    • ์„ธ์ƒ์˜ ๋ณธ์งˆ์€ ๋ณ€ํ™”์•ผ. ๋ชจ๋“  ๊ฒŒ ๋Š์ž„์—†์ด ํ๋ฅด๊ณ  ๋ฐ”๋€๋‹ค๊ณ  ๋ดค์–ด.
    • ๊ทผ๋ฐ ๊ทธ ๋ณ€ํ™” ์†์—๋„ ๋กœ๊ณ ์Šค(์งˆ์„œ์™€ ์ด์„ฑ์˜ ์›๋ฆฌ)๋ผ๋Š” ๊ทœ์น™์ด ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถˆ์€ ๊ณ„์† ํƒ€๋ฉด์„œ ๋ณ€ํ•˜์ง€๋งŒ ๊ทธ ์•ˆ์—” ์กฐํ™”๊ฐ€ ์žˆ์ง€! ๐Ÿ”ฅ
    • ๋น„์œ : ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ณ€์ˆ˜(variable) ๊ฐ™์•„. ๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๋Š” ๊ทธ๋ฆ‡!
    • ๐Ÿ“– ๋ช…์–ธ: “๊ฐ™์€ ๊ฐ•๋ฌผ์— ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.”
  • ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค: ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณ€ํ•œ๋‹ค! (Constant) ๐Ÿชจ
    • ๋ณ€ํ™”๋Š” ์ฐฉ๊ฐ์ด์•ผ! ์ง„์งœ ์‹ค์žฌ๋Š” **์กด์žฌ(Being)**์ด๊ณ , ์ด๊ฑด ํ•˜๋‚˜์ด๊ณ , ๋ถˆ๋ณ€ํ•˜๊ณ , ์˜์›ํ•ด.
    • ๊ฐ๊ฐ์œผ๋ก  ๋ณ€ํ™”๊ฐ€ ๋ณด์ด์ง€๋งŒ, ์ด์„ฑ์œผ๋ก  “์กด์žฌ๋Š” ์ ˆ๋Œ€ ์•ˆ ๋ณ€ํ•œ๋‹ค”๊ณ  ์ฃผ์žฅํ–ˆ์ง€.
    • ๋น„์œ : ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ƒ์ˆ˜(constant) ๊ฐ™์•„. ํ•œ ๋ฒˆ ์ •ํ•˜๋ฉด ๋ชป ๋ฐ”๊พธ๋Š” ๊ทธ๋ฆ‡!
    • ๐Ÿ“– ๋ช…์–ธ: “์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์กด์žฌํ•˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.”
  • ํ•œ ์ค„ ๋น„๊ต:
    • ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค → “๋ชจ๋“  ๊ฑด ๋ณ€ํ•œ๋‹ค” (๋ณ€์ˆ˜์ฒ˜๋Ÿผ).
    • ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค → “์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณ€ํ•œ๋‹ค” (์ƒ์ˆ˜์ฒ˜๋Ÿผ).
  • ๋ณด๋„ˆ์Šค: ์ด ๋‘˜์€ ํ”Œ๋ผํ†ค๊ณผ ์•„๋ฆฌ์Šคํ† ํ…”๋ ˆ์Šค ์ฒ ํ•™์˜ ๋ฟŒ๋ฆฌ๊ฐ€ ๋์–ด. ํ”Œ๋ผํ†ค์€ ๋‘˜์„ ์กฐํ™”์‹œํ‚ค๋ ค ํ–ˆ๊ณ , ์•„๋ฆฌ์Šคํ† ํ…”๋ ˆ์Šค๋Š” ‘ํ˜•์ƒ๊ณผ ์งˆ๋ฃŒ’๋กœ ๋ฐœ์ „์‹œ์ผฐ์ง€!

2. DTO vs VO: ๋ฐ์ดํ„ฐ ์ „๋‹ฌ vs ์˜๋ฏธ ์žˆ๋Š” ๊ฐ’ ๐Ÿ“ฆ๐Ÿง 

  • DTO (Data Transfer Object):
    • ๋ญ์•ผ ์ด๊ฒŒ? ์Šคํ”„๋ง์—์„œ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ทธ๋ฆ‡! Controller ↔ Service ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ.
    • ํŠน์ง•: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์—†์Œ, ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ. ๋ณดํ†ต getter/setter๋งŒ ์žˆ์–ด.
    • ์˜ˆ์‹œ: UserDto (์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ์„ ๋‹ด์•„ ์ „๋‹ฌ).
  • VO (Value Object):
    • ๋ญ์•ผ ์ด๊ฒŒ? ๊ฐ’ ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด! ๊ณ ์œ  ID ์—†์ด ์†์„ฑ ๊ฐ’์œผ๋กœ๋งŒ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง.
    • ํŠน์ง•: ๋ถˆ๋ณ€(Immutable), equals()๋กœ ๊ฐ’ ๋™๋“ฑ์„ฑ ๋น„๊ต. ์˜ˆ: Address ๊ฐ์ฒด(์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 10์€ ๊ฐ™์€ ๊ฐ’์ด๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰).
    • ์˜ˆ์‹œ: Money, Coordinate.
  • ๋น„๊ต:
     
    ๊ตฌ๋ถ„DTOVO
    ๋ชฉ์  ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋„๋ฉ”์ธ ๋‚ด ๊ฐ’ ํ‘œํ˜„
    ๋ถˆ๋ณ€์„ฑ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (setter ์žˆ์Œ) ๋ถˆ๋ณ€ (setter ์—†์Œ)
    ๋กœ์ง ์—†์Œ ๊ฐ’ ๊ด€๋ จ ๊ฒ€์ฆ/๊ณ„์‚ฐ ๊ฐ€๋Šฅ
    ์˜ˆ์‹œ UserDto, OrderRequestDto Address, Money
  • ๋น„์œ : DTO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ํƒ๋ฐฐ ์ƒ์ž๐Ÿ“ฆ, VO๋Š” ๊ทธ ์ž์ฒด๋กœ ์˜๋ฏธ ์žˆ๋Š” ๋ฌผ๊ฑด๐Ÿง .

3. Boolean๊ณผ Void: ์ฐธ/๊ฑฐ์ง“๊ณผ ์•„๋ฌด๊ฒƒ๋„ ์—†์Œ! โœ…๐Ÿšซ

  • Boolean:
    • ๋ญ์•ผ ์ด๊ฒŒ? ์ฐธ(true) ๋˜๋Š” ๊ฑฐ์ง“(false)๋งŒ ๋‹ด๋Š” ํƒ€์ž….
    • ์˜ˆ์‹œ: boolean isLogin = true; → ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ.
  • Void:
    • ๋ญ์•ผ ์ด๊ฒŒ? ์•„๋ฌด ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ํƒ€์ž…. ๊ทธ๋ƒฅ ๋™์ž‘(์ถœ๋ ฅ, ์ €์žฅ ๋“ฑ)๋งŒ ํ•˜๊ณ  ๋!
    • ์˜ˆ์‹œ: public void printHello() { System.out.println("Hello"); } → ์ถœ๋ ฅ๋งŒ ํ•˜๊ณ  ๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ.

4. Getter์™€ Setter: ์ฝ๊ณ  ์“ฐ๊ธฐ์˜ ๋น„๋ฐ€ ๐Ÿ–๏ธ

  • Getter:
    • ๋ญ์•ผ ์ด๊ฒŒ? ๊ฐ์ฒด์˜ ๊ฐ’์„ ๊บผ๋‚ด์˜ค๋Š” ๋ฉ”์„œ๋“œ. get์œผ๋กœ ์‹œ์ž‘.
    • ์˜ˆ์‹œ:
      java
       
      public class Person {
      private String name;
      public String getName() { return name; }
      }
      • ์‚ฌ์šฉ: Person p = new Person(); String name = p.getName();
    • ๋น„์œ : ๊ฐ’์„ ์ฝ๋Š” ๋ง์›๊ฒฝ๐Ÿ”ญ.
  • Setter:
    • ๋ญ์•ผ ์ด๊ฒŒ? ๊ฐ์ฒด์˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ. set์œผ๋กœ ์‹œ์ž‘.
    • ์˜ˆ์‹œ:
      java
       
      public class Person {
      private String name;
      public void setName(String newName) { this.name = newName; }
      }
      • ์‚ฌ์šฉ: p.setName("์„œ์€์ง„"); → ์ด๋ฆ„ ๋ณ€๊ฒฝ.
    • ๋น„์œ : ๊ฐ’์„ ์“ฐ๋Š” ํŽœโœ๏ธ.
  • ํ•œ ์ค„ ์š”์•ฝ: Getter๋Š” ์ฝ๊ธฐ, Setter๋Š” ์“ฐ๊ธฐ!

5. ๊ณ„์‚ฐ๊ธฐ ํ™ˆํŽ˜์ด์ง€: ์Šคํ”„๋ง์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž! ๐Ÿงฎ

  • ๊ตฌ์กฐ: ์Šคํ”„๋ง MVC๋กœ ๊ณ„์‚ฐ๊ธฐ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด Controller, Service, Domain์œผ๋กœ ๋‚˜๋ˆ .
  • ํ๋ฆ„:
    1. ์‚ฌ์šฉ์ž๊ฐ€ ์ˆซ์ž์™€ ์—ฐ์‚ฐ์ž ์ž…๋ ฅ → /calculate ์š”์ฒญ (์˜ˆ: ?num1=5&op=+&num2=3).
    2. Controller๊ฐ€ ์š”์ฒญ ๋ฐ›๊ณ  Service์— ๊ณ„์‚ฐ ๋งก๊น€.
    3. Service๊ฐ€ ๊ณ„์‚ฐํ•ด์„œ ๊ฒฐ๊ณผ ๋งŒ๋“ค๊ณ .
    4. Controller๊ฐ€ JSON์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜.
    5. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฐ๊ณผ ๋„์›€! ๐ŸŽ‰
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    • Domain (CalculationRequest.java - DTO):
      java
       
      public class CalculationRequest {
      private double num1;
      private String op;
      private double num2;
      // Getter, Setter
      public double getNum1() { return num1; }
      public void setNum1(double num1) { this.num1 = num1; }
      public String getOp() { return op; }
      public void setOp(String op) { this.op = op; }
      public double getNum2() { return num2; }
      public void setNum2(double num2) { this.num2 = num2; }
      }
    • Domain (CalculationResult.java - VO):
      java
       
      public class CalculationResult {
      private final double result; // ๋ถˆ๋ณ€ (VO ํŠน์ง•)
      public CalculationResult(double result) { this.result = result; }
      public double getResult() { return result; }
      @Override
      public boolean equals(Object o) { /* ๊ฐ’ ๋™๋“ฑ์„ฑ ๋น„๊ต */ }
      }
    • Service (CalculatorService.java):
      java
       
      @Service
      public class CalculatorService {
      public CalculationResult calculate(CalculationRequest request) {
      double num1 = request.getNum1();
      String op = request.getOp();
      double num2 = request.getNum2();
      double result;
      switch (op) {
      case "+": result = num1 + num2; break;
      case "-": result = num1 - num2; break;
      case "*": result = num1 * num2; break;
      case "/": result = num1 / num2; break;
      default: throw new IllegalArgumentException("์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž!");
      }
      return new CalculationResult(result);
      }
      }
    • Controller (CalculatorController.java):
      java
       
      @RestController
      @RequestMapping("/calculator")
      public class CalculatorController {
      @Autowired
      private CalculatorService calculatorService;
      @GetMapping("/calculate")
      public ResponseEntity<?> calculate(@RequestParam("num1") double num1,
      @RequestParam("op") String op,
      @RequestParam("num2") double num2) {
      CalculationRequest request = new CalculationRequest();
      request.setNum1(num1);
      request.setOp(op);
      request.setNum2(num2);
      CalculationResult result = calculatorService.calculate(request);
      return ResponseEntity.ok().body(Map.of("result", result.getResult()));
      }
      }
  • ๋น„์œ : Controller๋Š” ๊ณ„์‚ฐ๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋Š” ์‚ฌ๋žŒ, Service๋Š” ๊ณ„์‚ฐ๊ธฐ ๋‘๋‡Œ, Domain์€ ์ž…๋ ฅ๊ฐ’๊ณผ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‹ด๋Š” ๋ฉ”๋ชจ์ง€์•ผ! ๐Ÿงฎ

 



ํ—ค๋ผํด๋ผ์ดํ† ์Šค์™€ ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค ์ฐจ์ด์ 

๐Ÿ”ฅ ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค์˜ ์ฒ ํ•™

  • ๊ทธ๋Š” ์„ธ์ƒ์˜ ๋ณธ์งˆ์€ ๋ณ€ํ™”๋ผ๊ณ  ๋ดค์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ณ€ํ™” ์†์—๋„ **๋กœ๊ณ ์Šค(logos, ์งˆ์„œ์™€ ์ด์„ฑ์˜ ์›๋ฆฌ)**๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์ฃ .
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถˆ์€ ๋Š์ž„์—†์ด ํƒ€์˜ค๋ฅด๋ฉฐ ๋ณ€ํ•˜์ง€๋งŒ, ๊ทธ ์†์—๋Š” ์ผ์ •ํ•œ ๊ทœ์น™๊ณผ ์กฐํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    → ์ฆ‰, ๋ณ€ํ™” ์†์˜ ์งˆ์„œ๋ฅผ ๊ฐ•์กฐํ•œ ์ฒ ํ•™์ž์ž…๋‹ˆ๋‹ค.

๐Ÿ“– ํ•ต์‹ฌ ๊ตฌ์ ˆ:

“๊ฐ™์€ ๊ฐ•๋ฌผ์— ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.”


๐Ÿชจ ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค์˜ ์ฒ ํ•™

  • ๊ทธ๋Š” ์˜คํžˆ๋ ค “๋ณ€ํ™”๋Š” ์ฐฉ๊ฐ์ด๋‹ค”๋ผ๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง„์ •ํ•œ ์‹ค์žฌ๋Š” ์˜ค์ง ‘์กด์žฌ(Being)’์ด๋ฉฐ, ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์ด๊ณ  ๋ถˆ๋ณ€ํ•˜๋ฉฐ ์˜์›ํ•˜๋‹ค๊ณ  ๋ณด์•˜์ฃ .
  • ๊ฐ๊ฐ์œผ๋กœ๋Š” ๋ณ€ํ™”๋ฅผ ๋А๋ผ์ง€๋งŒ, **์ด์„ฑ์œผ๋กœ ๋ณด๋ฉด ‘์กด์žฌ๋Š” ๋ณ€ํ•  ์ˆ˜ ์—†๋‹ค’**๋Š” ๊ฒฐ๋ก ์— ์ด๋ฆ…๋‹ˆ๋‹ค.
    → ์ฆ‰, ๋ณ€ํ™”์˜ ์„ธ๊ณ„๋Š” ํ™˜์ƒ์ด๊ณ , ์กด์žฌ๋งŒ์ด ์ง„๋ฆฌ๋ผ๋Š” ๊ด€์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“– ํ•ต์‹ฌ ๊ตฌ์ ˆ:

“์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์กด์žฌํ•˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.”


๐Ÿงฉ ๋‘ ์ฒ ํ•™์ž์˜ ๋Œ€๋น„ ์š”์•ฝ

  • ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค → “๋ชจ๋“  ๊ฒƒ์€ ๋ณ€ํ•œ๋‹ค.”
  • ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค → “์•„๋ฌด๊ฒƒ๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.”
    ์ด ๋‘ ์ฒ ํ•™์ž๋Š” ์ดํ›„ ํ”Œ๋ผํ†ค๊ณผ ์•„๋ฆฌ์Šคํ† ํ…”๋ ˆ์Šค ์ฒ ํ•™์˜ ์ค‘์š”ํ•œ ์ถœ๋ฐœ์ ์ด ๋˜์—ˆ์–ด์š”.
    (ํ”Œ๋ผํ†ค์€ ์ด ๋‘˜์„ ์กฐํ™”์‹œํ‚ค๋ ค ํ–ˆ๊ณ , ์•„๋ฆฌ์Šคํ† ํ…”๋ ˆ์Šค๋Š” ์ด๋ฅผ ‘ํ˜•์ƒ๊ณผ ์งˆ๋ฃŒ’ ๊ฐœ๋…์œผ๋กœ ๋ฐœ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.)

 

 

  • ํ—ค๋ผํด๋ ˆ์ดํ† ์Šค → variable
  • ํŒŒ๋ฅด๋ฉ”๋‹ˆ๋ฐ์Šค → constant

 

value  → variable

?email=hong @test.com&

==

 


Spring(์Šคํ”„๋ง) ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” **DTO(Data Transfer Object)**๋Š”
์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ๊ณ„์ธต(Controller, Service, Repository ๋“ฑ) ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ „์šฉ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก DTO์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

**DTO (Data Transfer Object)**๋Š”
“๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋ณดํ†ต ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—†๋Š” ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ,
getter/setter, ์ƒ์„ฑ์ž, toString() ์ •๋„๋งŒ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๐Ÿงฑ ์Šคํ”„๋ง์—์„œ์˜ ๊ตฌ์กฐ ์˜ˆ์‹œ

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๊ณ„์ธต์—ญํ• ์˜ˆ์‹œ
Controller ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ UserController
Service ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ UserService
Repository DB ์ ‘๊ทผ UserRepository

์ด๋•Œ DTO๋Š” ์ฃผ๋กœ Controller ↔ Service ์‚ฌ์ด์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 


 

์ด๋ฒˆ์—๋Š” **VO(Value Object)**์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”.
์Šคํ”„๋ง์ด๋‚˜ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD, Domain Driven Design)์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ,
DTO์™€ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ๊ฐ์ฒด์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก VO(Value Object)์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

**VO(Value Object)**๋Š”
๊ฐ’(value) ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์–ด๋–ค ์†์„ฑ๋“ค์˜ ์กฐํ•ฉ์ด ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ,
๊ทธ ๊ฐ์ฒด์˜ **๊ณ ์œ ํ•œ ID๋‚˜ ์‹๋ณ„์ž(Identifier)**๊ฐ€ ์—†์–ด์š”.
๋™์ผ์„ฑ๋ณด๋‹ค **๊ฐ’์˜ ๋™๋“ฑ์„ฑ(equality)**์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 


โš™๏ธ VO์˜ ํŠน์ง• ์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
์˜๋ฏธ ์ค‘์‹ฌ ๊ฐ’ ์ž์ฒด๊ฐ€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง (์˜ˆ: Money, Address, DateRange ๋“ฑ)
๋ถˆ๋ณ€์„ฑ(Immutable) ์ƒ์„ฑ ํ›„ ๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„
๋™๋“ฑ์„ฑ ๋น„๊ต equals()์™€ hashCode()๋กœ ๋‚ด์šฉ ๊ธฐ๋ฐ˜ ๋น„๊ต
์‹๋ณ„์ž ์—†์Œ ID ๋Œ€์‹  ์†์„ฑ ๊ฐ’์œผ๋กœ๋งŒ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„
์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿšซ DTO์™€์˜ ์ฐจ์ด์ 

๊ตฌ๋ถ„DTOVO
์ฃผ์š” ๋ชฉ์  ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋„๋ฉ”์ธ ๋‚ด ‘๊ฐ’’ ํ‘œํ˜„
๋ถˆ๋ณ€์„ฑ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (setter ์žˆ์Œ) ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์„ค๊ณ„
๋กœ์ง ํฌํ•จ ์—ฌ๋ถ€ ์—†์Œ (๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ) ์žˆ์Œ (๊ฐ’ ๊ด€๋ จ ๊ฒ€์ฆ/๊ณ„์‚ฐ ๋กœ์ง ๊ฐ€๋Šฅ)
์‹๋ณ„์ž ํ•„์š”์— ๋”ฐ๋ผ ์กด์žฌ ์—†์Œ
์˜ˆ์‹œ UserDto, OrderRequestDto Money, Address, Coordinate

๐Ÿง  ์ •๋ฆฌํ•˜์ž๋ฉด

  • DTO๋Š” "๋ฐ์ดํ„ฐ ์ „๋‹ฌ์šฉ"
  • VO๋Š” "์˜๋ฏธ ์žˆ๋Š” ๊ฐ’ ํ‘œํ˜„์šฉ"

์ฆ‰,

DTO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ทธ๋ฆ‡,
VO๋Š” ์˜๋ฏธ ์žˆ๋Š” ๊ฐ’ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.


boolean์˜ ์˜๋ฏธ

  • **์ฐธ(true) ๋˜๋Š” ๊ฑฐ์ง“(false)**์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํƒ€์ž…

 

void์˜ ์˜๋ฏธ

  • ์•„๋ฌด ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, return ๋ฌธ ๋’ค์— ๊ฐ’์„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ **๋™์ž‘(์ถœ๋ ฅ, ์ €์žฅ, ์‚ญ์ œ ๋“ฑ)**๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์ค„ ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ์šฉ

 


๊ณ„์‚ฐ๊ธฐ ํ™ˆํŽ˜์ด์ง€ ๋œจ๊ฒŒ ํ•˜๋ ค๋Š”๋ฐ controller, domain, service๋กœ java์ฝ”๋“œ ์งœ๋ ค๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ

๋ฌด๋ฃŒ ํ•œ๊ตญ์–ด GPT์˜ ๋ง:

์ข‹์•„์š” ๐Ÿ‘ ์•„์ฃผ ์ข‹์€ ๋ฐฉํ–ฅ์ด์—์š”!
๊ณ„์‚ฐ๊ธฐ ํ™ˆํŽ˜์ด์ง€”๋ฅผ ์Šคํ”„๋ง(Spring Boot)์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ์‹  ๊ฑฐ์ฃ .
๊ทธ๋ ‡๋‹ค๋ฉด MVC ํŒจํ„ด์— ๋”ฐ๋ผ Controller, Service, Domain ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ๋”ฑ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ์ด์—์š”.

์•„๋ž˜์— ๊ธฐ์ดˆ์ ์ธ ๊ตฌ์กฐ ์„ค๊ณ„ → ๊ฐ ๊ณ„์ธต๋ณ„ ์ฝ”๋“œ ์˜ˆ์‹œ → ์ „์ฒด ํ๋ฆ„ ์„ค๋ช…๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š” ๐Ÿ‘‡


๐Ÿงฉ 1. ์ „์ฒด ๊ตฌ์กฐ ๊ฐœ์š” (MVC ์•„ํ‚คํ…์ฒ˜)

๊ณ„์ธต์—ญํ• ํŒŒ์ผ ์˜ˆ์‹œ
Controller ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ (์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ) CalculatorController.java
Service ์‹ค์ œ ๊ณ„์‚ฐ ๋กœ์ง ์ˆ˜ํ–‰ CalculatorService.java
Domain ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ •์˜ (์š”์ฒญ/๊ฒฐ๊ณผ ์ €์žฅ) CalculationRequest.java, CalculationResult.java

 

๐Ÿง  ์‹คํ–‰ ํ๋ฆ„ ์š”์•ฝ

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆซ์ž์™€ ์—ฐ์‚ฐ์ž๋ฅผ ์ž…๋ ฅ → /calculator/calculate ์š”์ฒญ ์ „์†ก
  2. Controller๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ณ  CalculatorService ํ˜ธ์ถœ
  3. Service๊ฐ€ ์‹ค์ œ ๊ณ„์‚ฐ ์ˆ˜ํ–‰
  4. ๊ฒฐ๊ณผ(CalculationResult)๋ฅผ JSON์œผ๋กœ ๋ฐ˜ํ™˜
  5. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฐ๊ณผ ํ‘œ์‹œ ๐ŸŽ‰

 

 

 


 

๊ฒŒํ„ฐ: ์ฝ๋Š”๋‹ค

์„ธํ„ฐ: ์“ด๋‹ค

 

1๏ธโƒฃ ๊ฒŒํ„ฐ(Getter)

  • ๋ฌด์—‡์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ?
     ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ๊บผ๋‚ด์˜ค๋Š” ์—ญํ• 
  • ํ˜•์‹: ๋ณดํ†ต get์œผ๋กœ ์‹œ์ž‘
  • ์˜ˆ์‹œ:
 
public class Person { private String name; // private๋ผ ์™ธ๋ถ€์—์„œ ๋ฐ”๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€ // getter public String getName() { return name; // name ๊ฐ’์„ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ } }
  • ์‚ฌ์šฉ:
 
Person p = new Person(); String myName = p.getName(); // name ๊ฐ’์„ ๊บผ๋‚ด์˜ด

๐Ÿ’ก ํ•ต์‹ฌ: ์ฝ๊ธฐ ์ „์šฉ ์—ญํ• 


2๏ธโƒฃ ์„ธํ„ฐ(Setter)

  • ๋ฌด์—‡์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ?
     ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• 
  • ํ˜•์‹: ๋ณดํ†ต set์œผ๋กœ ์‹œ์ž‘
  • ์˜ˆ์‹œ:
 
public class Person { private String name; // setter public void setName(String newName) { this.name = newName; // name ๊ฐ’ ๋ณ€๊ฒฝ } }
  • ์‚ฌ์šฉ:
 
Person p = new Person(); p.setName("์„œ์€์ง„"); // name ๊ฐ’์„ "์„œ์€์ง„"์œผ๋กœ ๋ณ€๊ฒฝ

๐Ÿ’ก ํ•ต์‹ฌ: ์“ฐ๊ธฐ ์ „์šฉ ์—ญํ• 


3๏ธโƒฃ ์ •๋ฆฌ

๊ตฌ๋ถ„์—ญํ• ๋ฉ”์„œ๋“œ ์˜ˆ์‹œ๋ฐ˜ํ™˜๊ฐ’
Getter ๊ฐ’ ์ฝ๊ธฐ getName() ์ฝ์€ ๊ฐ’ ๋ฐ˜ํ™˜
Setter ๊ฐ’ ์“ฐ๊ธฐ/์„ค์ • setName("ํ™๊ธธ๋™") ๋ณดํ†ต void

4๏ธโƒฃ ํ•œ ์ค„ ์š”์•ฝ

Getter = ๊บผ๋‚ด๊ธฐ, Setter = ๋„ฃ๊ธฐ

 

→ ์ด Address ํด๋ž˜์Šค๋Š” **VO(Value Object)**์ž…๋‹ˆ๋‹ค.
์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 10๊ณผ ๋™์ผํ•œ ๊ฐ’์˜ ์ฃผ์†Œ๋ผ๋ฉด,
๋‘ ๊ฐ์ฒด๋Š” ์™„์ „ํžˆ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๊ฐ์ฒด์˜ “์ฃผ์†Œ๊ฐ’”์ด ์•„๋‹ˆ๋ผ “๋‚ด์šฉ(value)”๋กœ ํŒ๋‹จํ•œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ด์š”.