JavaRush /Java Blog /Random-KO /์ปคํ”ผ ๋ธŒ๋ ˆ์ดํฌ #70. Lombok์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ...

์ปคํ”ผ ๋ธŒ๋ ˆ์ดํฌ #70. Lombok์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๊ต์œก ๋ชฉ๋ก

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

Lombok์œผ๋กœ Java ์ฝ”๋“œ ์ž‘์„ฑ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•

์ถœ์ฒ˜: Dev.to ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋™์ผํ•œ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
  • ๊ฒŒํ„ฐ;
  • ์„ธํ„ฐ;
  • ๋””์ž์ด๋„ˆ;
  • ๋นŒ๋” ๋””์ž์ธ ํŒจํ„ด;
  • ๊ทธ๋ฆฌ๊ณ  ํ›จ์”ฌ ๋”โ€ฆ
์ด๋Ÿฐ ์ผ์ƒ์ ์ธ ์ผ์„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋งก๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”? ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋กฌ๋ณต์ด ์šฐ๋ฆฌ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.์ปคํ”ผ ๋ธŒ๋ ˆ์ดํฌ #70.  Lombok์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•  ์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๋‚˜์˜ ๊ต์œก ๋ชฉ๋ก - 1

๊ทธ๋Š” ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋‚˜์š”?

์ด๋Š” ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…(getter, setter ๋“ฑ)์— ๋Œ€ํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ .class์— ๋„ฃ์–ด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋‚˜์š”?

Maven ๋นŒ๋“œ์— Lombok ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›ํ•˜๋Š” ํด๋ž˜์Šค, ์ผ๋ถ€ Lombok ์ฃผ์„์ด ์žˆ๋Š” ํ•„๋“œ์— ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž! ๋กฌ๋ณต ์ œ์™ธ:
public class Human {
    private int id;
    private String name;
    private int ageInYears;

    public Human() { }

    public Human(int id, String name, int ageInYears) {
        this.id = id;
        this.name = name;
        this.ageInYears = ageInYears;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAgeInYears() {
        return ageInYears;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAgeInYears(int ageInYears) {
        this.ageInYears = ageInYears;
    }

    // Builder pattern
  public Human id(int id){
        this.id = id;
        return this;
    }
    public Human name(String name){
        this.name = name;
        return this;
    }
    public Human ageInYears(int ageInYears){
        this.ageInYears = ageInYears;
        return this;
    }

    @Override
  public String toString(){
        return String.format("Human(id=%s, name=%s, ageInYears=%s)",
                this.id, this.name, this.ageInYears);
    }
}
์ด์ œ Lombok์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import lombok.*;
@Getter @Setter
@AllArgsConstructor @NoArgsConstructor
@Builder @ToString
public class Human {
    @Setter(AccessLevel.NONE)
    private int id;
    private String name;
    private int ageInYears;
}
Maven ์ข…์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>
์ฐธ๊ณ : ๋ฒ„์ „ ๋ถ€๋ถ„์€ ์ตœ์‹  Lombok ๋ฆด๋ฆฌ์Šค์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ํ–ˆ๋‚˜์š”?

์šฐ๋ฆฌ๋Š” ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ getter, setter, ์ƒ์„ฑ์ž, Builder ๋””์ž์ธ ํŒจํ„ด ๋ฐ toString ๊ตฌํ˜„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. id ํ•„๋“œ์˜ setter์™€ ๊ฐ™์€ ์ผ๋ถ€ ์ฃผ์„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ˆ˜์ค€์„ ์—†์Œ์œผ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์— ๋Œ€ํ•œ ์„ค์ •์ž๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•  ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์—ˆ๋‚˜์š”?

์šฐ๋ฆฌ๋Š” Lombok์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ 52์ค„์„ ์ผ์Šต๋‹ˆ๋‹ค . Lombok์„ ์‚ฌ์šฉํ•˜์—ฌ 8์ค„์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค . Lombok์€ ์ฝ”๋“œ ํฌ๊ธฐ๋ฅผ ๊ฑฐ์˜ 4๋ฐฐ๋กœ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๊ต์‹ค์— ๋ณ€์ˆ˜๊ฐ€ ๋” ๋งŽ์œผ๋ฉด ์ด ์ ์ˆ˜๊ฐ€ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Lombok์—๋Š” ์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ๋งŽ์ด ํฌํ•จ๋œ ๋” ๋งŽ์€ ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด๋ ค๋ฉด ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š” .

๊ฒฐ๋ก 

Lombok์€ ์ž‘์€ ์„ธ๋ถ€ ์‚ฌํ•ญ(getter/setter/constructors/์ผ๋ฐ˜ ๋””์ž์ธ ํŒจํ„ด ๋ฐ ๊ธฐํƒ€ Java ๊ตฌ์„ฑ)์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๊ต์œก ๋ชฉ๋ก

์ถœ์ฒ˜ : DZone ๋‚ด ์นœ๊ตฌ์—๊ฒŒ๋Š” ๊ณง ๊ณ ๋“ฑํ•™๊ต๋ฅผ ์กธ์—…ํ•  ์•„๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜์–ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๊ทธ๋Š” ๋‚˜์—๊ฒŒ โ€œ๋‹ค์Œ์—๋Š” ๋ฌด์—‡์„ ๊ฐ€๋ฅด์ณ์•ผ ํ•ฉ๋‹ˆ๊นŒ?โ€๋ผ๊ณ  ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ปคํ”ผ ๋ธŒ๋ ˆ์ดํฌ #70.  Lombok์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•  ์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๊ต์œก ๋ชฉ๋ก - 2์ œ๊ฐ€ ์ฒ˜์Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ, โ€œ๋‹ค์Œ์— ๋ฌด์—‡์„ ๋ฐฐ์›Œ์•ผ ํ• ๊นŒ์š”?โ€๋ผ๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ , ์ƒˆ๋กœ์šด ์–ธ์–ด, ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋ ฅ์„ ์Œ“์•„๊ฐ€๋ฉด์„œ ๋งˆ์Œ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ์—ฐ๋งˆํ•˜๊ณ  ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ ์™ธ์—๋„, ์•ผ์‹ฌ ์ฐฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ด€๋ จ ๋ถ„์•ผ์—์„œ ๊ณต๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ์ด ๊ธ€์—์„œ ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๋ผ๊ณ  ์ถ”์ฒœํ•˜๊ณ  ์‹ถ์€ ๊ธฐ์ˆ  ๋ชฉ๋ก์„ ๋ชจ์œผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ชฉํ‘œ๋Š” ํ˜„์žฌ ์ง€์‹์„ ๋ชจ๋‘ ๋‚˜์—ดํ•˜๊ฑฐ๋‚˜ ํŠœํ† ๋ฆฌ์–ผ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹ , ๋‚˜๋Š” ์ดˆ๋ณด์ž๋“ค์ด ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ จ์˜ ๋„๊ตฌ, ๊ธฐ์ˆ  ๋ฐ ๊ธฐ์ˆ ์— ์ต์ˆ™ํ•ด์ง€๋„๋ก ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์ค„

๋‚˜๋Š” ์–ด๋–ค ๊ธฐ์ค€์—์„œ๋Š” ์ด๋ฏธ "๋Š™์—ˆ๋‹ค"๊ณ  ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ DOS์— ์•‰์•„์„œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ ๋งŽ์€ ๊ฒƒ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋„๊ตฌ๋Š” ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ช…๋ น์ค„์—์„œ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋””๋ ‰ํ„ฐ๋ฆฌ ์ˆœํšŒ.
  • ํŒŒ์ผ ๊ด€๋ฆฌ(๋ณต์‚ฌ/์ด๋™/์‚ญ์ œ).
  • ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ ๋ฐ/๋˜๋Š” ์‹คํ–‰.
Windows๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ „์ฒด ๊ฐ€์ƒ ๋จธ์‹  ๋Œ€์‹  WSL2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Linux์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Mac์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ OS์— ๋‚ด์žฅ๋œ ์…ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Linux ๊ฐ€์ƒ ๋จธ์‹ ์„ ์„ค์น˜ํ•˜์—ฌ ์ข‹์€ ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ

๋ฒ„์ „ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ๊ด€๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ์ • ๋‚ด์—ญ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋””๋ฒ„๊น…์— ํ•„์ˆ˜์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ณต๋™ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub ์™€ GitLab์€ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๋‘ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค Git์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด). Git์€ ์š”์ฆ˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋„๊ตฌ์ด๋ฏ€๋กœ GitHub ๋˜๋Š” GitLab์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์ค„์—์„œ Git์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์ตœ์†Œํ•œ ์ผ์ • ์ˆ˜์ค€์˜ ๋„คํŠธ์›Œํ‚น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ IP ์ฃผ์†Œ, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ ๋“ฑ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์€ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉํ™”๋ฒฝ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ํ”„๋ก์‹œ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋ฉด ๋‚˜์ค‘์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝ๋ ฅ๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. "Wi-Fi๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. AWS, Azure ๋“ฑ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ ๊ธฐ๋ณธ๋„ ๋ฐฐ์›Œ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒ๋„ท, ๋กœ๊ทธ์ธ ๊ทœ์น™, ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AWS Virtual Private Cloud๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋„คํŠธ์›Œํ‚น ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์žˆ์–ด ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์€ ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ณ  "ํ…Œ์ŠคํŠธ"ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ๋‹จ์œ„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ์ž‘์—…ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•„์ˆ˜ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ง€๋ฃจํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋น ๋ฅด๊ณ  ์ž์‹ ๊ฐ์„ ๊ฐ–๊ณ  ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ

์ง€์†์  ํ†ตํ•ฉ(CI)์€ ํ…Œ์ŠคํŠธ์™€ ๋ฒ„์ „ ์ œ์–ด๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ฝ”๋“œ ๋ฐ˜๋ณต์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. CI ๋„๊ตฌ๋Š” ์ง€๋‚œ 10๋…„ ๋™์•ˆ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GitHub์™€ GitLab์—๋Š” CI ์†”๋ฃจ์…˜(๊ฐ๊ฐ GitHub Actions ๋ฐ GitLab CI)์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CI๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋‹จ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋ฐฐ์šฐ๋ฉด ๋ฌธ์ œ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ ์ž์„ธํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ธ€์“ฐ๊ธฐ ๋Šฅ๋ ฅ

์•„๋งˆ๋„ ์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ์ผ์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ๊ณผ์†Œํ‰๊ฐ€ํ–ˆ๋˜ ๋ถ„์•ผ๊ฐ€ ๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด์ œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์‹ ์˜ ๋ฌด๊ธฐ๊ณ ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์€ ๊ธ€์“ฐ๊ธฐ๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ธ€์“ฐ๊ธฐ ๋Šฅ๋ ฅ์€ ์ตœ์†Œํ•œ์˜ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ด๋””์–ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šธ ๋•Œ๋Š” ๋Œ€๊ฐœ ํ˜ผ์ž ์ž‘์—…ํ•˜๋ฏ€๋กœ ๊ธ€์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ€์œผ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜;
  • ๋ฒ„๊ทธ ์‹ ๊ณ 
  • ๊ธฐ๋Šฅ ์š”์ฒญ;
  • ๊ณ ๊ฐ ์ œ์•ˆ
  • ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๋ฌธ์„œ
  • ์ด๋ฉ”์ผ(๋งŽ์€ ์ด๋ฉ”์ผ!)
  • ๋ฌธ์ž ๋ฉ”์‹œ์ง€
  • ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ(์•„๋งˆ๋„)
๊ธ€์“ฐ๊ธฐ๋ฅผ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์šด๋™. ๊ธ€์“ฐ๊ธฐ ๊ฐ•์ขŒ๋ฅผ ์ˆ˜๊ฐ•ํ•˜์„ธ์š”. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ๋‚จ์€ ์ƒ์•  ๋™์•ˆ ๋ฐฐ๋‹น๊ธˆ์„ ์ง€๋ถˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž˜ ์ฝ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์ œ๊ฐ€ ์ฒ˜์Œ ์ „๋ฌธ์„ฑ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์š”๊ตฌ์‚ฌํ•ญ ๋ฌธ์„œ ๋•Œ๋ฌธ์— ๊ฒ์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด์ œ ์ด ์ •๋ณด๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ์—ฐ๊ตฌํ•˜๋Š” ๋ฐ ๋ช‡ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋‚ญ๋น„๋˜๋Š” ์ˆ˜๊ฐœ์›”์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

์š”์ฆ˜์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ•˜๋‚˜๋งŒ ์•„๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ตœ์†Œํ•œ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋ ค๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฒ”์ฃผ์˜ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ๋‚ด๋ฆผ์ฐจ์ˆœ: ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ. ๋Œ€๋ถ€๋ถ„์˜ ํ•™๊ต์—์„œ๋Š” ์—ฌ์ „ํžˆ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FP)์„ ๊ฐ€๋ฅด์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FP๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŽธ๊ฒฌ์ด ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด๋ณด๋‹ค FP๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Haskell์„ ๋ฐฐ์šฐ๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ์–ธ์–ด๋กœ ์ถ”์ฒœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. LISP ๊ณ„์—ด์˜ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด๋กœ ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ. ์‹œ์Šคํ…œ ์–ธ์–ด๋Š” ํ•˜์œ„ ์ˆ˜์ค€์— ์†ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ ์ž‘๋™์„ ๋” ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์—ฐ๊ตฌํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Rust๋ฅผ ๋ฐฐ์šฐ๊ณ  C์™€ C++๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด. Java์™€ C#์€ ์ด ๊ณ„์—ด์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. (์˜ˆ, Python๊ณผ C++๋„ ์ธ๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ ๋ณ„๋„๋กœ ๊ฐ•์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). OOP๋Š” ๋งŽ์€ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋„์ž…ํ–ˆ์œผ๋ฉฐ ๊ฐœ์ธ์ ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ๋ฐฐ์šธ ๊ฒƒ์ด ๋งŽ์œผ๋ฉฐ ๊ฒฝ๋ ฅ์„ ์Œ“์œผ๋ฉด์„œ ๊ฒฐ๊ตญ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ. Python๊ณผ Ruby๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œํ’ˆ๊ตฐ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ Python์€ DevOps, ๋ฐ์ดํ„ฐ ๊ณผํ•™ ๋“ฑ ๊ด€๋ จ ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ์ž‘ํ•˜๊ธฐ ๋งค์šฐ ์‰ฌ์šด ๊ฐ„๋‹จํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•

์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋“  ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ํŠน์ • ์–ธ์–ด๋ฅผ ๋„˜์–ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ์ˆ ์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ. SQL์„ ๋ฐฐ์šฐ์‹œ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. SQLite์™€ PostgreSQL์€ ์‚ดํŽด๋ณผ ๋‘ ๊ฐ€์ง€ ์˜คํ”ˆ ์†Œ์Šค DBMS์ž…๋‹ˆ๋‹ค.
  • ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ. ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์ ์  ๋” ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ , ํŠนํžˆ HTTP ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ.
  • HTML/CSS/JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ .
  • JSON, YAML, ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค .

๊ฒฐ๋ก 

์œ„์˜ ์ •๋ณด๋Š” ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ์ „๋ฌธ์ ์ธ ์—ฐ์Šต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์• ์™„๋™๋ฌผ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆ™๋ จ๋œ ์ฝ”๋”๋กœ๋ถ€ํ„ฐ ํŽธ์•ˆํ•จ์„ ๋Š๋ผ๊ณ  ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ž์‹ ์˜ ์ง€์‹์„ ์ดˆ๋ณด์ž์™€ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION