<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kiki-dev</title>
    <link>https://kiki97-dev.tistory.com/</link>
    <description>개발공부기록</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 04:53:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>kiki97</managingEditor>
    <image>
      <title>kiki-dev</title>
      <url>https://tistory1.daumcdn.net/tistory/5512290/attach/e8b6e907a7a8400885483cab35ea3e57</url>
      <link>https://kiki97-dev.tistory.com</link>
    </image>
    <item>
      <title>Typescript for Beginners</title>
      <link>https://kiki97-dev.tistory.com/96</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Typescript&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strongly typed programming&lt;/li&gt;
&lt;li&gt;컴파일 시 javascript로 변환됨&lt;/li&gt;
&lt;li&gt;에러가&amp;nbsp;발생&amp;nbsp;&amp;rarr;&amp;nbsp;컴파일&amp;nbsp;X&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Javascript&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매우&amp;nbsp;유연해서&amp;nbsp;에러를&amp;nbsp;잘&amp;nbsp;보여주지&amp;nbsp;않음&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  숫자 배열 + false &amp;rarr; 배열이 사라지고 string으로 바뀜&lt;br /&gt;  함수의 인자에 데이터타입이 잘못 들어가도 실행됨&lt;br /&gt;  const a = { a: &quot;A&quot; }; a.hello(); 실행 시 에러 발생&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (런타임에러, 실행할때 발생하는 에러) &amp;rarr; 실행 전에 에러 감지 불가&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타입스크립트를&amp;nbsp;사용하는이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입&amp;nbsp;안정성은&amp;nbsp;타입스크립트가&amp;nbsp;제공하는&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;장점이다. &lt;br /&gt;타입 안정성 덕분에 버그가 엄청 줄어든다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Type&amp;nbsp;시스템&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;명시적 정의(변수 선언 시 타입 정의)&lt;br /&gt;let a: boolean = &quot;x&quot; &amp;rarr; ❌ boolean 타입에 string타입 할당 불가 알림&lt;br /&gt;&lt;br /&gt;변수만 생성(타입 추론)&lt;br /&gt;let b = &quot;hello&quot; &amp;rarr; b가 string 타입이라고 추론&lt;br /&gt;b = 1 &amp;rarr; ❌ string 타입에 number타입 할당 불가 알림&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Type&amp;nbsp;Alias(별칭)&amp;nbsp;타입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Type&amp;nbsp;Aliases을&amp;nbsp;사용하여&amp;nbsp;객체&amp;nbsp;타입뿐만&amp;nbsp;아니라&amp;nbsp;모든&amp;nbsp;이름에&amp;nbsp;타입을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1702049092732&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Player = {
    readonly name: string, // ❗ readonly가 있으면 최초 선언 후 수정 불가 '읽기전용'
    age?:number //number | undefine
}

argument 역시 타입을 지정할 수 있다. `(parameter : type)`
함수의 return에도 타입을 지정할 수 있다.
function (parameter : type) : type {
    return
}

✅ Tuple
정해진 개수와 순서에맞는 타입의 값을 요구할때 유용하다.
const player: [string, number, boolean] = [&quot;nico&quot;, 1, true]
player[0] = 1 // 바꿀수없다. string으로 지정됨

✅ any, unknown, void, never
any: 아무 타입. 타입체크를 '비활성화' 시켜버린다.
unknown : 변수의 타입을 미리 알지 못할때 사용할때마다 변수타입 지정을 요구한다.
void : 값을 반환하지 않는 함수에서 반환 자료형
never : 함수가 절대 return 하지 않는다.​&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❗ ?를 :앞에 붙이면 optional&amp;nbsp;&lt;/li&gt;
&lt;li&gt;❗ readonly가 있으면 최초 선언 후 수정 불가 &amp;rArr; immutability(불변성) 부여 but, javascript에서는 그냥 배열&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Call&amp;nbsp;Signatures&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 매개변수와 반환 값의 타입을 모두 type으로 미리 선언하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;React에서&amp;nbsp;함수로&amp;nbsp;props를&amp;nbsp;보낼&amp;nbsp;때,&amp;nbsp;어떻게&amp;nbsp;작동할지&amp;nbsp;미리&amp;nbsp;설계&amp;nbsp;가능!&lt;/p&gt;
&lt;pre id=&quot;code_1700801687970&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Add = (a: number, b: number) =&amp;gt; number;

//화살표 함수 중괄호 주의사항
const add:Add = (a,b) =&amp;gt; a+b
function add(a, b) {
	return (a+b)
}

const add:Add = (a,b) =&amp;gt; {a+b}
function add(a, b) {
	a+b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화살표 함수에서 {}를 생략하면 return이 생략된 것&lt;/li&gt;
&lt;li&gt;즉 a + b 와 { return a+b } 는 같은 뜻&lt;/li&gt;
&lt;li&gt;{a+b}라고 하면 아무것도 리턴하지 않기 때문에 에러남&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overloading&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한&amp;nbsp;이름에&amp;nbsp;매개&amp;nbsp;변수와&amp;nbsp;매개&amp;nbsp;변수&amp;nbsp;타입&amp;nbsp;또는&amp;nbsp;리턴&amp;nbsp;타입이&amp;nbsp;다른&amp;nbsp;여러&amp;nbsp;버전의&amp;nbsp;함수를&amp;nbsp;만드는&amp;nbsp;것을&amp;nbsp;말합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript에서는&amp;nbsp;오버로드&amp;nbsp;signatures을&amp;nbsp;작성하여&amp;nbsp;&quot;다양한&amp;nbsp;방식으로&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;함수&quot;를&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700802760315&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Add = {
    (a: number, b: number): number,
    (a: number, b: string): number
}

const add: Add = (a, b) =&amp;gt; {
    if (typeof b === &quot;string&quot;) return a;
    return a + b;
}

매개변수의 데이터 타입이 다른 경우 예외 처리

type Add2 = {
    (a: number, b: number): number,
    (a: number, b: number, c: number): number
}

const add2: Add2 = (a, b, c?: number) =&amp;gt; {
    if (c) return a + b + c;
    return a + b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;polymorphism&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인자들과&amp;nbsp;반환값에&amp;nbsp;대하여&amp;nbsp;형태(타입)에&amp;nbsp;따라&amp;nbsp;그에&amp;nbsp;상응하는&amp;nbsp;형태(타입)를&amp;nbsp;갖을&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;any와의&amp;nbsp;차이점은&amp;nbsp;해당&amp;nbsp;타입에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;잃지&amp;nbsp;않는다. &lt;br /&gt;any는&amp;nbsp;any로서&amp;nbsp;밖에&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없지만&amp;nbsp;generics는&amp;nbsp;타입&amp;nbsp;정보를&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;pre id=&quot;code_1700803367226&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type SuperPrint={
    &amp;lt;T&amp;gt;(arr:T[]):T;
}

const superPrint:SuperPrint=(arr)=&amp;gt;{
    return arr[0]
}

const a=superPrint([1,2,3])
const b=superPrint([true,false,true])
const c=superPrint([&quot;a&quot;,&quot;b&quot;])
const d=superPrint([1,2,&quot;a&quot;,&quot;b&quot;,true])&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Generics&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수나 인수에 타입을 정해주는 Concrete같이 딱딱한 기법과 달리 어떤 타입을 쓸지 정해주지 않고 그 타입에 대해 어떤 변수를 넣어주냐에 따라 결정되는 유연한 기법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1700804217587&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function identity&amp;lt; Type &amp;gt;(arg: Type): Type {
    return arg;
}

const identity=&amp;lt; Type extends {} &amp;gt;(arg: Type):Type =&amp;gt; {
    return arg;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700804754117&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Player&amp;lt;T&amp;gt; = {
    name: string,
    extraInfo: T
};

const player2: Player&amp;lt;object&amp;gt; = {
    name: &quot;Yee&quot;,
    extraInfo: {
        age: 23,
        stature: 170,
        weight: 60
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Classes&lt;/h3&gt;
&lt;pre id=&quot;code_1700811354297&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;추상(abstract) 클래스
추상 클래스는 오직 다른 클래스가 상속받을 수 있는 클래스이다.
하지만 직접 새로운 인스턴스를 만들 수는 없다.

abstract class User {
    constructor(
        private firstName: string,
        private lastName: string,
        protected nickname: string,
    ) {

    }

    abstract getNickName(): void
     // 추상 메서드는 추상 클래스를 상속받는 클래스들이 반드시 구현(implement)해야하는 메서드이다.
}

class Player extends User {
    getNickName() {
        return `nickname: ${this.nickname}`
    }
}

const lsc: Player = new Player(&quot;lee&quot;, &quot;sc&quot;, &quot;lsc&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;선언한 클래스 내&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;상속받은 클래스 내&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px; text-align: center;&quot;&gt;인스턴스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;private&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px; text-align: center;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;⭕&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702049113265&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Team = &quot;read&quot;| &quot;blue&quot; | &quot;yellow&quot; // type에 특정 값을 가지도록 제한&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700825250355&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Words = { // 해시
    [key: string]: (string | string[])
    //객체의 property에 대해 모르지만 타입만을 알 때 유용하다
}
class Dict {
    private words: Words
    constructor() {
    this.words = {}
}


// 각각의 단어에 대한 클래스
class Word {
    constructor(
        public readonly term: string, //readonly '읽기전용, 수정불가'
        public def: string
    ) {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Static&amp;nbsp;Members&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static&amp;nbsp;Methods는&amp;nbsp;클래스를&amp;nbsp;생성안해도&amp;nbsp;사용이&amp;nbsp;가능!&lt;/p&gt;
&lt;pre id=&quot;code_1701062829201&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyClass {
    static x = 0;
    
    static printX() {
    	console.log(MyClass.x);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interfaces&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의&amp;nbsp;모양을&amp;nbsp;특정해주기&amp;nbsp;위해&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701060922111&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Hello = string; // 오류, 인터페이스는 오로지 오브젝트

type Hello = string // type은 가능, 비슷한 type이 기능이 더 많다

클래스는 여러 인터페이스를 구현할 수도 있다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tsconfig.json설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉터리에&amp;nbsp;tsconfig.json&amp;nbsp;파일이&amp;nbsp;있으면&amp;nbsp;해당&amp;nbsp;디렉터리가&amp;nbsp;TypeScript&amp;nbsp;프로젝트의&amp;nbsp;루트임을&amp;nbsp;나타냅니다.&amp;nbsp;tsconfig.json&amp;nbsp;파일은&amp;nbsp;프로젝트를&amp;nbsp;컴파일하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;루트&amp;nbsp;파일과&amp;nbsp;컴파일러&amp;nbsp;옵션을&amp;nbsp;지정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701326212896&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;include&quot;: [&quot;src&quot;],
    &quot;compilerOptions&quot;: {
        &quot;outDir&quot;: &quot;build&quot;,
        &quot;target&quot;: &quot;ES6&quot;,
        &quot;moduleResolution&quot;: &quot;node&quot;,
        &quot;lib&quot;: [&quot;ES6&quot;,&quot;DOM&quot;] // 타입스크립트에게 어떤 환경에서 코드를 실행하는 지를 지정할 수 있습니다.
                             //(target 런타임 환경이 무엇인지를 지정합니다.)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타입스크립트&amp;nbsp;코드&amp;nbsp;테스트&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/play&quot;&gt;https://www.typescriptlang.org/play&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://nomadcoders.co/typescript-for-beginners&quot;&gt;노마드 코더 타입스크립트로 블록체인 만들기&lt;/a&gt;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/96</guid>
      <comments>https://kiki97-dev.tistory.com/96#entry96comment</comments>
      <pubDate>Sat, 9 Dec 2023 00:14:31 +0900</pubDate>
    </item>
    <item>
      <title>fullpage.js v2.9.7</title>
      <link>https://kiki97-dev.tistory.com/94</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;라이브러리 깃허브 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2까지는 무료이용이 가능하다구함&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://github.com/alvarotrigo/fullPage.js/tree/2.9.7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/alvarotrigo/fullPage.js/tree/2.9.7&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;CDN&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://cdnjs.com/libraries/fullPage.js/2.9.7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cdnjs.com/libraries/fullPage.js/2.9.7&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제파일&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://alvarotrigo.com/fullPage/examples/scrollBar.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://alvarotrigo.com/fullPage/examples/scrollBar.html&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b93U9c/btr752RlWvu/FKQZucB58WRXwKigXmCVl1/fullPage.js-master.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;fullPage.js-master.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;8.52MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안에 예제보면서 필요한 부분들 가지구와서 쓰면 댈듯&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JavaScript/라이브러리</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/94</guid>
      <comments>https://kiki97-dev.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 5 Apr 2023 14:55:55 +0900</pubDate>
    </item>
    <item>
      <title>Jquery load()</title>
      <link>https://kiki97-dev.tistory.com/93</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;.load()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 데이터를 로드하고 반환된 HTML을 일치하는 요소에 배치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1670282432047&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.load(url [, data ][, complete ])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공통 부분 컴포넌트화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 페이지에서 사용되는 헤더부분이 수정되면 그 페이지들마다 하나씩 수정해줘야하는 번거로움이 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통된부분을 따로 빼서 불러오는 방식으로 분리해서 관리했다.&lt;/p&gt;
&lt;pre id=&quot;code_1670283759892&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    $(&quot;#headers&quot;).load(&quot;common/header.html&quot;);
    $(&quot;#footers&quot;).load(&quot;common/footer.html&quot;);
&amp;lt;/script&amp;gt;

&amp;lt;body&amp;gt; 
    &amp;lt;div id=&quot;headers&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;footers&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;load불러온 데이터가 headers,footers안으로 들어가게된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스크립트 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;load메소드로 불러온 데이터는 동적으로 추가된거라 그런지 스크립트가 안먹혔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭이벤트와 같은것은 동적 이벤트 바인딩을 통해서 사용하면 됐는데, 스와이퍼js같이 로드되고나서 바로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용돼야하는 스크립트가 안먹혔었는데 load 메소드뒤 콜백함수안에 넣어서 사용하니 해결됐다.&lt;/p&gt;
&lt;pre id=&quot;code_1670284092538&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$( &quot;#result&quot; ).load( &quot;ajax/test.html&quot;, function() {
  alert( &quot;Load was performed.&quot; );
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://api.jquery.com/load/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://api.jquery.com/load/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/blacklish1/221017411129&quot;&gt;https://blog.naver.com/blacklish1/221017411129&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://offbyone.tistory.com/235&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://offbyone.tistory.com/235&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/93</guid>
      <comments>https://kiki97-dev.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 6 Dec 2022 08:50:00 +0900</pubDate>
    </item>
    <item>
      <title>React.js란?</title>
      <link>https://kiki97-dev.tistory.com/90</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;리액트(React)란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;자바스크립트의 UI 라이브러리 지금은 Meta가 된 Facebook이 개발한 오픈소스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트를 확장한 문법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React요소를 HTML문법처럼 만들수 있게해줌&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;https://unpkg.com/react@17.0.2/umd/react.production.min.js&lt;br /&gt;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트 예약어랑 겹치는건 사용못하니 주의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class = className, for = htmlFor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Babel&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX코드를 브라우저가 이해할수 있는 형태로 바꿔줌&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;https://unpkg.com/@babel/standalone/babel.min.js&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트의 첫 글자는 반드시 대문자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;React.js의 state&lt;/h3&gt;
&lt;pre id=&quot;code_1687851534787&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const [counter, setCounter] = React.useState(0); //값을 넣지않으면 초기값은 0 이다
//setCounter : counter값 수정 후 리렌더해줌&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'실제로 바뀌는 값'만 판단해서 불필요한 리렌더링을 제외하고 동작한다.&lt;/li&gt;
&lt;li&gt;counter 은 현재의 값 state이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;State Functions&lt;/h4&gt;
&lt;pre id=&quot;code_1689904804778&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const onClick = () =&amp;gt; {
    setCounter(counter + 1);
    setCounter((current)=&amp;gt; current + 1); //함수를 사용할 경우 리액트가 current 값이 현재 값이라는걸 보장
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 state를 기반으로 계산하고 싶다면 함수를 이용&lt;/li&gt;
&lt;li&gt;예상치 못한 업데이트가 어디선가 일어났다고 해도 안전&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Props&lt;/h4&gt;
&lt;pre id=&quot;code_1697437592736&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn(props)

// props 생략하고 꺼내오기 가능
function Btn({text})

function App() {
    return (
        &amp;lt;div&amp;gt;
            &amp;lt;Btn text=&quot;Save Changes&quot; big={true}/&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성안에 있는 모든값들을 첫번째 인자에 객체로 넘겨줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Memo&lt;/h4&gt;</description>
      <category>React</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/90</guid>
      <comments>https://kiki97-dev.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 1 Nov 2022 21:19:54 +0900</pubDate>
    </item>
    <item>
      <title>인텔리제이 한글깨짐</title>
      <link>https://kiki97-dev.tistory.com/88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;단축키 Ctrl + Alt + S&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpk69X/btrPKBWWYhX/ikkOxGMmE3XZdSwOTLv3s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpk69X/btrPKBWWYhX/ikkOxGMmE3XZdSwOTLv3s1/img.png&quot; data-alt=&quot;위와 같이 설정 고고링&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpk69X/btrPKBWWYhX/ikkOxGMmE3XZdSwOTLv3s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdpk69X%2FbtrPKBWWYhX%2FikkOxGMmE3XZdSwOTLv3s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;723&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위와 같이 설정 고고링&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bShGqO/btrPHygAfGm/Hvh2I3k5KaeGw7jVVpxKkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bShGqO/btrPHygAfGm/Hvh2I3k5KaeGw7jVVpxKkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bShGqO/btrPHygAfGm/Hvh2I3k5KaeGw7jVVpxKkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbShGqO%2FbtrPHygAfGm%2FHvh2I3k5KaeGw7jVVpxKkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1057&quot; height=&quot;585&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머스테치가 스프링부트 2.7.0이상에서 한글깨짐 이슈가 있다고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bulid gradle에서 2.6.7로 버전을 다운그레이드 하니 한글깨짐이슈 해결완료&lt;/p&gt;</description>
      <category>Spring Boot</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/88</guid>
      <comments>https://kiki97-dev.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 27 Oct 2022 21:25:27 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 요청 메소드(GET, POST)</title>
      <link>https://kiki97-dev.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP&amp;nbsp;요청&amp;nbsp;메소드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL을 이용하면 서버에 특정 데이터를 요청할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 요청하는 데이터에 특정 동작을 수행하고 싶으면 HTTP 요청 메소드(Http Request Methods)를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 HTTP 요청 메서드는 HTTP Verbs라고도 불리우며 아래와 같이 주요 메서드를 갖고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET&amp;nbsp;:&amp;nbsp;존재하는&amp;nbsp;자원에&amp;nbsp;대한&amp;nbsp;요청&lt;/li&gt;
&lt;li&gt;POST&amp;nbsp;:&amp;nbsp;새로운&amp;nbsp;자원을&amp;nbsp;생성&lt;/li&gt;
&lt;li&gt;PUT&amp;nbsp;:&amp;nbsp;존재하는&amp;nbsp;자원에&amp;nbsp;대한&amp;nbsp;변경&lt;/li&gt;
&lt;li&gt;DELETE&amp;nbsp;:&amp;nbsp;존재하는&amp;nbsp;자원에&amp;nbsp;대한&amp;nbsp;삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GET방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;클라이언트에서 서버로 어떠한 리소스 정보를 요청하기 위해(데이터를 읽거나 검색할때) 사용되는 메서드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET은 요청을 전송할 때 필요한 데이터를 쿼리스트링을 통해 전송한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL의 끝에 ? 와 함께 이름과 값으로 상을 이루는 요청 파라미터를 쿼리스트링이라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리스트링을 사용하면 URL에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1666339107932&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;www.example-url.com/resources?name1=value1&amp;amp;name2=value2&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;만약, 요청 파라미터가 여러 개면 &amp;amp;로 연결한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;요청 파라미터명은 nam1, nam2&lt;/li&gt;
&lt;li&gt;각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1666339304592&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET은 불필요한 요청을 제한하기 위해 요청이 캐시가 될 수 있다.
JS,CSS같은 정적 컨텐츠는 데이터양이 크고, 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가없다. 
정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시로해두고,
동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용한다.
그래서 프론트엔드 개발을 하다보면 정적 컨텐츠가 캐시돼 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생한다. 
이 때는 브라우저의 캐시를 지우고 다시 컨텐츠를 조회하면 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET 요청은 캐시가 가능하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;:GET을 통해 서버에 리소스를 요청할 때 웹 캐시가 요청을 가로채 서버로부터 리소스를 다시 다운로드하는 대신&amp;nbsp;&lt;br /&gt;리소스의&amp;nbsp;복사본을&amp;nbsp;반환한다.&amp;nbsp;HTTP&amp;nbsp;헤더에서&amp;nbsp;cache-control&amp;nbsp;헤더를&amp;nbsp;통해&amp;nbsp;캐시&amp;nbsp;옵션을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;li&gt;GET&amp;nbsp;요청은&amp;nbsp;브라우저&amp;nbsp;히스토리에&amp;nbsp;남는다.&lt;/li&gt;
&lt;li&gt;GET 요청을 북마크에 추가할 수 있다.&lt;/li&gt;
&lt;li&gt;GET&amp;nbsp;요청은&amp;nbsp;길이&amp;nbsp;제한이&amp;nbsp;있다.&lt;/li&gt;
&lt;li&gt;GET 요청은 중요한 정보를 다루면 안된다. (파라미터 내용이 노출돼서)&lt;/li&gt;
&lt;li&gt;GET 요청은 데이터를 읽을 때만 사용되고 수정할 때는 사용하지 않는다.(데이터의 변형 위험 없이 사용가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;POST방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 메서드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 HTTP 메세지의 Body에 담아서 전송한다.(길이의 제한 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬 개발자 도구로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우 반드시 암호화해 전송해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1666348977239&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추한다.
만약, 알 수 없는 경우에는  application/octet-stream로 요청을 처리한다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POST&amp;nbsp;요청은&amp;nbsp;캐시되지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;li&gt;POST&amp;nbsp;요청은&amp;nbsp;브라우저&amp;nbsp;기록에&amp;nbsp;남아&amp;nbsp;있지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;li&gt;POST&amp;nbsp;요청을&amp;nbsp;북마크에&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;없습니다.&lt;/li&gt;
&lt;li&gt;POST&amp;nbsp;요청에는&amp;nbsp;데이터&amp;nbsp;길이에&amp;nbsp;대한&amp;nbsp;제한이&amp;nbsp;없습니다.&lt;/li&gt;
&lt;li&gt;Post&amp;nbsp;요청&amp;nbsp;중&amp;nbsp;자원&amp;nbsp;생성은&amp;nbsp;201(Created)&amp;nbsp;HTTP&amp;nbsp;응답&amp;nbsp;코드를&amp;nbsp;반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GET과 POST에 차이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yVWTN/btrPflHYW9p/Rqm5e5OSvH7fEgbXJKrJRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yVWTN/btrPflHYW9p/Rqm5e5OSvH7fEgbXJKrJRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yVWTN/btrPflHYW9p/Rqm5e5OSvH7fEgbXJKrJRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyVWTN%2FbtrPflHYW9p%2FRqm5e5OSvH7fEgbXJKrJRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;440&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 73.0233%; height: 319px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;GET&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;POST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;캐시&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;⭕️&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;브라우저 기록&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;⭕️&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;북마크 추가&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;⭕️&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;데이터 길이 제한&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;⭕️&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;HTTP 응답 코드&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;200(Ok)&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;201(Created)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;언제 주로 사용하는가?&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;리소스 요청&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;리소스 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;리소스 전달 방식&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;쿼리스트링&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;HTTP Body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.6411%; height: 50px;&quot;&gt;idempotent&lt;/td&gt;
&lt;td style=&quot;width: 34.7112%;&quot;&gt;⭕️&lt;/td&gt;
&lt;td style=&quot;width: 32.5315%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;idempotent(멱등성)란??&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산을 여러번 적용하더라도 결과가 달라지지 않는 성질&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 멱등이라는 것은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET으로 서버에 동일한 요청을 여러번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 GET은 서버의 데이터나 상태를 변경시키지 않아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위를 GET으로 요청하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST는 서버의 상태나 데이터를 변경시킬 때 사용&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://brilliantdevelop.tistory.com/32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brilliantdevelop.tistory.com/32&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@songyouhyun/Get과-Post의-차이를-아시나요&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@songyouhyun/Get과-Post의-차이를-아시나요&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터지식</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/87</guid>
      <comments>https://kiki97-dev.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 21 Oct 2022 19:40:12 +0900</pubDate>
    </item>
    <item>
      <title>절대경로와 상대경로</title>
      <link>https://kiki97-dev.tistory.com/86</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;절대경로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상위 디렉토리부터 해당 파일까지 경유한 경로를 전부 기입하는 방식&lt;/p&gt;
&lt;pre id=&quot;code_1666335265799&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/ : 최상위 디렉토리(루트 디렉토리)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상대경로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 파일이 존재하는 디렉토리를 기준으로 해당 파일까지의 위치를 작성한 경로&lt;/p&gt;
&lt;pre id=&quot;code_1666335453983&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./ : 현재 디렉토리
../ : 현재 디렉토리의 상위 디렉토리&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;절대로경로와 상대경로의 차이점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 50px; background-color: #333;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;절대경로&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;상대경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 50px;&quot;&gt;
&lt;td style=&quot;height: 20px; background-color: #333;&quot;&gt;컴파일 속도&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;느리다&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;빠르다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 50px;&quot;&gt;
&lt;td style=&quot;height: 20px; background-color: #333;&quot;&gt;해당 소스의 위치 변환 시&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;경로를 다시 지정&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기준이 된 폴더의 구성이 달라지지 않는 한 경로지정을 할 필요가 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 50px;&quot;&gt;
&lt;td style=&quot;height: 20px; background-color: #333;&quot;&gt;분실 가능성&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;낮다&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;높다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 50px;&quot;&gt;
&lt;td style=&quot;height: 20px; background-color: #333;&quot;&gt;사용할 때&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;타 개발자의 소스 링크시&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;개발팀 내에서 소스 링크 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mollangpiu.tistory.com/222&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mollangpiu.tistory.com/222&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mommoo.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mommoo.tistory.com/82&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ryurbsgks5114/절대경로와-상대경로&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@ryurbsgks5114/절대경로와-상대경로&lt;/a&gt;&lt;/p&gt;</description>
      <category>컴퓨터지식</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/86</guid>
      <comments>https://kiki97-dev.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 21 Oct 2022 16:06:50 +0900</pubDate>
    </item>
    <item>
      <title>머스테치(mustache)란?</title>
      <link>https://kiki97-dev.tistory.com/85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;템플릿 엔진&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 템플릿 양식과 데이터가 합쳐져 HTML문서를 출력하는 소프트웨어를 이야기한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 엔진에는 서버 템플릿 엔진과 클라이언트 템플릿 엔진이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서버 템플릿 엔진&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 Java 코드로 문자열을 만든 뒤 이 문자열을 HTML로 변환하여 브라우저로 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DwYBv/btrO9PoNZQd/Pp4ELres6dfLTwyLxIz7d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DwYBv/btrO9PoNZQd/Pp4ELres6dfLTwyLxIz7d1/img.png&quot; data-alt=&quot;https://qazyj.tistory.com/344&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DwYBv/btrO9PoNZQd/Pp4ELres6dfLTwyLxIz7d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDwYBv%2FbtrO9PoNZQd%2FPp4ELres6dfLTwyLxIz7d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;171&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://qazyj.tistory.com/344&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JPS, Velocity : 스프링 부트에서는 권장하지 않는 템플릿 엔진&lt;/li&gt;
&lt;li&gt;Freemarker : 템플릿 엔진으로는 너무 과하게 많은 기능을 지원한다.&lt;br /&gt;(숙련도가 낮을수록 비즈니스 로직이 추가될 가능성이 높다)&lt;/li&gt;
&lt;li&gt;Thymleaf&amp;nbsp;:&amp;nbsp;스프링&amp;nbsp;진영에서&amp;nbsp;적극적으로&amp;nbsp;지원하는&amp;nbsp;템플릿&amp;nbsp;엔진이지만&amp;nbsp;문법이&amp;nbsp;어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라이언트 템플릿 엔진&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서는 브라우저로 데이터만 직렬화(JSON)해서 넘겨주고, 브라우저에서 HTML을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 소스 코드가 브라우저에서 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bprcVZ/btrPaHQ8ftd/5D99pbKyvLXRsfC7Ixwk21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bprcVZ/btrPaHQ8ftd/5D99pbKyvLXRsfC7Ixwk21/img.png&quot; data-alt=&quot;https://qazyj.tistory.com/344&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bprcVZ/btrPaHQ8ftd/5D99pbKyvLXRsfC7Ixwk21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbprcVZ%2FbtrPaHQ8ftd%2F5D99pbKyvLXRsfC7Ixwk21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;209&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://qazyj.tistory.com/344&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React,&amp;nbsp;Vue,&amp;nbsp;Anguler&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;서버에서&amp;nbsp;가져온&amp;nbsp;데이터(JSON,&amp;nbsp;XML&amp;nbsp;등)를&amp;nbsp;가지고&amp;nbsp;웹&amp;nbsp;화면을&amp;nbsp;꾸며주는&amp;nbsp;&lt;br /&gt;라이브러리(혹은&amp;nbsp;프레임워크)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mustache란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Springboot 에서 공식으로 지원하는 템플릿 엔진, 수 많은 언어를 지원하는 가장 심플한 템플릿 엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA에서 사용될 때는 서버 템플릿 엔진으로, Javascript에서 사용될 때는 클라이언트 템플릿 엔진으로 사용가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;머스테치의 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문법이 다른 템플릿 엔진보다 심플하다.&lt;/li&gt;
&lt;li&gt;로직 코드를 사용할 수 없어 View의 역할과 서버의 역할이 명확하게 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1666263901039&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JSP경우 &amp;lt;% %&amp;gt;안에 있는 JAVA문법은 서버단에서, Javascirpt 는 클라이언트단에서 동작하기 때문에 
하나의 JSP 파일 안에서 서버와 클라이언트 코드가 뒤섞이는 등의 문제가 있어 유지보수하기 어려움&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mustache설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Setting&amp;nbsp;-&amp;gt;&amp;nbsp;Plugins&amp;nbsp;Mustache&amp;nbsp;검색&amp;nbsp;후&amp;nbsp;install&amp;nbsp;-&amp;gt;&amp;nbsp;restart&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxk4Se/btrPakIDpXO/K1zHZU8potbkyLraEYqIQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxk4Se/btrPakIDpXO/K1zHZU8potbkyLraEYqIQk/img.png&quot; data-alt=&quot;https://qazyj.tistory.com/344&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxk4Se/btrPakIDpXO/K1zHZU8potbkyLraEYqIQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxk4Se%2FbtrPakIDpXO%2FK1zHZU8potbkyLraEYqIQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;923&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://qazyj.tistory.com/344&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1666264358770&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies{
	compileOnly 'org.springframework.boot:spring-boot-starter-mustache'
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;build.gradle에 의존성 추가&lt;/li&gt;
&lt;li&gt;의존성만 추가하면 다른 스타터 패키지와 마찬가지로 추가 설정 없이 설치가 끝난다.&lt;/li&gt;
&lt;li&gt;머스테치의&amp;nbsp;파일&amp;nbsp;위치는&amp;nbsp;기본적으로&amp;nbsp;main/resources/templates&amp;nbsp;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Mustache&amp;nbsp;의&amp;nbsp;ViewResolver&amp;nbsp;처리&amp;nbsp;방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러에서 뷰를 리턴할 때 ViewResolver가 뷰 객체 처리를 담당하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머스테치를 사용하면 뷰를 리턴할 때 ViewResolver가 알아서 src/main/resources/template 안에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*.mustache 파일이 존재하는지 확인하고, 존재한다면 해당 뷰를 보여주도록 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1666265678927&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/&quot;)
public String index(Model model){
     // mustache 를 사용하게 되면 앞에 경로(src/main/resources/templates)와
     // 뒤에 확장자(.mustache)는 생략을 한 순수한 파일의 이름만 반환하면 된다.
     // 아래와 같이 index 를 반환하게 되면
     // src/main/resources/templates/index.mustache 로 변환되어 View Resolver 가 처리하게 된다.
     return &quot;index&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://m.blog.naver.com/nuberus/221884812398&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.blog.naver.com/nuberus/221884812398&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qazyj.tistory.com/344&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://qazyj.tistory.com/344&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@nyong_i/머스테치Mustache란-무엇인가&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@nyong_i/머스테치Mustache란-무엇인가&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring Boot</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/85</guid>
      <comments>https://kiki97-dev.tistory.com/85#entry85comment</comments>
      <pubDate>Thu, 20 Oct 2022 20:38:17 +0900</pubDate>
    </item>
    <item>
      <title>스프링 @Controller, @GetMapping</title>
      <link>https://kiki97-dev.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Controller&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring에서 컨트롤러를 지정해주기 위한 어노테이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Controller의 역할은 &lt;span style=&quot;color: #f3c000;&quot;&gt;Model 객체를 만들어 데이터를 담고 View를 반환하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHtpgM/btrO93NaS9j/INSDcgK2MqetCyIpDcsDnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHtpgM/btrO93NaS9j/INSDcgK2MqetCyIpDcsDnk/img.png&quot; data-alt=&quot;www.facebook.com/photo/?fbid=1873079892846068&amp;amp;amp;set=gm.3389524044492534&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHtpgM/btrO93NaS9j/INSDcgK2MqetCyIpDcsDnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHtpgM%2FbtrO93NaS9j%2FINSDcgK2MqetCyIpDcsDnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;710&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;www.facebook.com/photo/?fbid=1873079892846068&amp;amp;set=gm.3389524044492534&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client는 URL형식으로 웹 서비스에 요청을 보낸다.&lt;/li&gt;
&lt;li&gt;DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.&lt;/li&gt;
&lt;li&gt;HandlerMapping을 통해 요청을 Controller로 위임한다.&lt;/li&gt;
&lt;li&gt;Controller는 요청을 처리한 후에 ViewName을 반환한다.&lt;/li&gt;
&lt;li&gt;DispatcherServlet은&amp;nbsp;ViewResolver를&amp;nbsp;통해&amp;nbsp;ViewName에&amp;nbsp;해당하는&amp;nbsp;View를&amp;nbsp;찾아&amp;nbsp;사용자에게&amp;nbsp;반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@GetMapping&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP GET 요청을 처리하는 메서드를 맵핑(@RequestMapping)하는 어노테이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드(url)에 따라 어떤 페이지를 보여줄지 결정하는 역할을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1666261412600&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class FirstController {

    @GetMapping(&quot;/hi&quot;) //해당 url이 호출될때 아래 메서드가 호출된다.
    public String hi(){
        return &quot;hi&quot;; // 리턴값의 이름을 가진 파일을 찾아 출력한다.
    }

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring Boot</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/84</guid>
      <comments>https://kiki97-dev.tistory.com/84#entry84comment</comments>
      <pubDate>Thu, 20 Oct 2022 19:14:24 +0900</pubDate>
    </item>
    <item>
      <title>MVC패턴이란?</title>
      <link>https://kiki97-dev.tistory.com/83</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC패턴이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델-뷰-컨트롤러(model&amp;ndash;view&amp;ndash;controller,&amp;nbsp;MVC)는&amp;nbsp;소프트웨어&amp;nbsp;공학에서&amp;nbsp;사용되는&amp;nbsp;소프트웨어&amp;nbsp;디자인&amp;nbsp;패턴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션을 세 개의 영역으로 분할하고 각 구성 요소에게 고유한 역할을 부여하는 개발 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC패턴을 도입하면 도메인(비즈니스 로직)영역과 UI영역이 분리되므로 서로 영향을 주지 않고 유지보수가 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1665646638107&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;디자인패턴이란?
프로그램을 개발하는 과정에서 빈번하게 발생하는 디자인 문제를 정리해 재사용하기 좋은 형태로
특정 규약을 만들어서 정리한것. 즉, 효율적인 코드를 만들기 위한 방법론&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;  &lt;/b&gt;모델(Model)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;DATA, 정보들의 가공을 책임지는 컴포넌트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 어플리케이션의 정보, 데이터를 나타낸다. 데이타베이스, 처음의 정의하는 상수, 초기화 값, 변수 등을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 로직을 처리한 후 모델의 변경사항을 컨트롤러와 뷰에 전달한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665648331535&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;모델은 다음과 같은 규칙을 가지고 있다.
사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.
변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; ️ 뷰(View)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;사용자에게 보여지는 부분, 유저 인터페이스를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC패턴은 여러 개의 뷰(View)가 존재할 수 있으며, 모델에게 질의하여 데이터를 전달받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰는 받은 데이터를 화면에 표시해주는 역할을 가지고 있다. 사용자가 화면에 표시된 내용을 변경하게 되면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델에게 전달하여 모델을 변경해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665648636019&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;뷰는 다음과 같은 규칙을 가지고 있다.
모델이 가지고 있는 정보를 따로 저장해서는 안된다.
모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 된다.
변경이 일어나면 변경통지에 대한 처리방법을 구현해야한다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; ️ 컨트롤러(Controller)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;모델과 뷰 사이를 이어주는 브릿지 역할을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이나 뷰는 서로의 존재를 모르고 있다. 변경 사항을 외부로 알리고 수신하는 방법만 있는데, 컨트롤러는 이를 중재하기 위해 모델과 뷰에 대해 알고 있어야 한다. 모델이나 뷰로부터 변경 내용을 통지 받으면 이를 각 구성 요소에게 통지해야한다. 사용자가 어플리케이션을 조작하여 발생하는 변경 이벤트들을 처리하는 역할을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665648836593&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;컨트롤러는 다음과 같은 규칙을 가지고 있다.
모델이나 뷰에 대해서 알고 있어야한다.
모델이나 뷰의 변경을 모니터링 해야한다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVC 패턴흐름&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AMLlA/btrOs2auh08/utwZifiTYee6nhLUMz6481/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AMLlA/btrOs2auh08/utwZifiTYee6nhLUMz6481/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AMLlA/btrOs2auh08/utwZifiTYee6nhLUMz6481/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAMLlA%2FbtrOs2auh08%2FutwZifiTYee6nhLUMz6481%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;708&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 웹 사이트에 접속&lt;/li&gt;
&lt;li&gt;컨트롤러는 사용자가 요청한 웹페이지를 서비스하기 위해서 모델을 호출&lt;/li&gt;
&lt;li&gt;모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후 그 결과를 리턴&lt;/li&gt;
&lt;li&gt;컨트롤러는 모델이 리턴한 결과를 뷰에 반영(Updates)&lt;/li&gt;
&lt;li&gt;데이터가 반영된 View는 사용자에게 보여짐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC 패턴방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC패턴에는 모델1 방식과 모델2 방식이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 1 방식 : JSP에서 출력과 로직을 전부 처리&lt;/li&gt;
&lt;li&gt;모델 2방식 : JSP에서 출력만 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Model1&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FIQKM/btrOvgH6zuA/yvpZg8xmWvnAUZKCqpgBO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FIQKM/btrOvgH6zuA/yvpZg8xmWvnAUZKCqpgBO1/img.png&quot; data-alt=&quot;https://cocoon1787.tistory.com/733&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FIQKM/btrOvgH6zuA/yvpZg8xmWvnAUZKCqpgBO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFIQKM%2FbtrOvgH6zuA%2FyvpZg8xmWvnAUZKCqpgBO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;360&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://cocoon1787.tistory.com/733&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델1방식은 컨트롤러 영역에 뷰영역을 같이 구현하는 방식이며, 사용자의 요청을 JSP가 전부 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 받은 JSP는 JavaBean Service Class를 사용하여 사용자가 요청한 작업을 처리하고 그 결과를 출력&lt;/p&gt;
&lt;pre id=&quot;code_1665655484915&quot; class=&quot;erlang&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Model1 방식으로 웹서비스를 개발하는 사례는 백엔드와 프론트엔드의 역할 분담이 모호해져
협업이 쉽지 않으며 실제 서비스들 중에서 거의 없다고 봐도 무방하다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Model2&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbC0Nr/btrOvbGISkN/0KmlIdalKHnUpXRfPQBFN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbC0Nr/btrOvbGISkN/0KmlIdalKHnUpXRfPQBFN1/img.png&quot; data-alt=&quot;https://cocoon1787.tistory.com/733&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbC0Nr/btrOvbGISkN/0KmlIdalKHnUpXRfPQBFN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbC0Nr%2FbtrOvbGISkN%2F0KmlIdalKHnUpXRfPQBFN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;362&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://cocoon1787.tistory.com/733&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델2 방식은 사용자의 요청을 서블릿이 받고 서블릿은 해당 요청으로 View로 보여줄 것인지 Model로 보낼 것인지를 판단하여 전송한다. 또한 모델2 방식의 경우 HTML소스와 JAVA소스를 분리해놓았기 때문에 모델1 방식에 비해 확장시키기도 쉽고 유지보수 또한 쉽다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://junhyunny.github.io/information/design-pattern/mvc-pattern/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://junhyunny.github.io/information/design-pattern/mvc-pattern/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://cocoon1787.tistory.com/733&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cocoon1787.tistory.com/733&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #222222; color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://inf.run/zFyL&quot;&gt;[개념은&amp;nbsp;호옹~,&amp;nbsp;실습&amp;nbsp;빡]&amp;nbsp;스프링&amp;nbsp;부트,&amp;nbsp;입문!&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>컴퓨터지식</category>
      <author>kiki97</author>
      <guid isPermaLink="true">https://kiki97-dev.tistory.com/83</guid>
      <comments>https://kiki97-dev.tistory.com/83#entry83comment</comments>
      <pubDate>Thu, 13 Oct 2022 19:27:01 +0900</pubDate>
    </item>
  </channel>
</rss>