JavaScript

  • Expression
    • 값을 만들어내는 간단한 코드를 표현식이라고 합니다.
    • 표현식은 값을 만들어내기 때문에 함수의 인자로 사용할수 있다.

     

  • Statement
    • 하나 혹은 여러 개의 표현식이 모여 문장을 이룹니다.
    • 모든 표현식은 문장이 될 수 있습니다.
    • (보통) 문장의 끝에는 세미 콜론을 붙입니다.
    • 한 줄에 여러 문장을 적을 경우, 세미콜론으로 문장을 구분해야 한다.
    • 마지막 문장은 세미 콜론을 붙이지 않아도 문제가 없다.
    • 마지막 문장의 결과가 반환된다.
    • 조건문 (if), 반복문 (for) 도 문장입니다.
    • 이 경우에는 마지막 } 뒤에 세미콜론을 붙이지 않습니다.
    • 문장들이 모여 만들고자 하는 프로그램이 된다.
  • Keywords, Reserved Words(키워드와 예약어)
    • Keywords
      • 자바스크립트에서 특정한 목적을 위해 사용되는 단어
      • 이러한 키워드 들은 예약어(?)로 지정되어 있습니다.

       

    • Reserved Words
      • 프로그램을 작성할 때, 변수명, 함수명 등 이름으로 사용할 수 없는 단어

       

    • Reserved Keywords
      • 이미 특정한 목적을 위해 사용하기 때문에 사용할 수 없는 예약어

       

       

    • Future reserved keywords
      • 앞으로 특정한 목적을 위해 사용할 가능성이 있어서 사용할 수 없는 예약어

     

  • 식별자(Identifier)
    • 코드 내의 변수, 함수, 혹은 속성을 식별하는 문자열
    • 대소문자를 구분한다.
    • '유니코드 문자', '$', '_','숫자(0-9)'를 사용할 수 있지만, 숫자로 시작 할수는 없습니다.
    • '예약어'는 사용할 수 없고, '공백 문자'도 사용할 수도 없습니다.

     

     

  • 주석(Comments)
    • 소스 코드에서 프로그램에 영향을 주지 않고, 무시되는 부분
    • 보통은 소스코드를 이해할수 있도록 돕는 역할로 사용
    • 한 줄만 주석(한 줄을 주석으로 만들고 싶을떈, //를 사용합니다)
    • 여러 줄 주석(여러 줄을 주석으로 만들고 싶으면, 시작과 끝에 /* */를 사용한다.)

     

  • 변수와 상수(variable and constant)
    • const 상수를_지칭하는_이름 → 상수를 선언하는 방법
    • const 상수를_지칭하는_이름 = 값; → 상수를 선언하면서 바로 값을 할당하는 방법
    • let 변수를_지칭하는_이름; → 변수를 선언하는 방법
    • 변수를_지칭하는_이름 = 값; → 변수에 값을 할당하는 방법

     

  • 변수의 유효 범위(scope of variables)
    • {} 안에서만 유효하다
      // 블럭
      {
          //
          const name = 'Mark';
          console.log(name);
      }
      →결과
      {}밖에서는 name을 인식 못한다.

      // 블럭
      {
          //
          const name = 'Mark';
          console.log(name);
      }
      
      //console.log(name);
      
      //밖에서 안으로
      let age = 37;
      
      {
          age++;
          console.log(age);
      }
      
      console.log(age);
      →결과
      • var의 유효 범위(함수 스코프)
      • function() {} 함수
      // var 함수 스코프
      
      var a = 0;
      
      (function(){
          a++;
          console.log(a);
      })();
      
      console.log(a);
      
      (function(){
          var b = 0;
          console.log(b);
      })
      
      b++;
      console.log(b);
      →결과

      • var는 함수스코프이기 때문에 {}은 있으나 없으나 상관없어서 정상적으로 출력이 된다
      //블록 스코프
      
      var c = 0;
      
      {
          c++;
          console.log(c);
      }
      
      {
          var d = 0;
          console.log(d);
      }
      
      console.log(d);
      →결과

     

    • // 블럭 { // const name = 'Mark'; console.log(name); } console.log(name);
  • var와 호이스팅

    호이스팅 : 아래에 있는 함수를 위에서 호출 가능한 현상(아래 있는 선언을 끌어올리다.)

    호이스팅은 var에서만 일어난다.

    ex)

    // 함수먼저
    function hello1(){
        console.log('hello1');
    }
    
    hello1();
    
    // 함수의 호출을 먼저
    hello2();
    
    function hello2(){
        console.log('hello2');
    }

    →결과

     

  • 자료형

    변수가 가지는 고정 타입이 없다. 하지만 타입이 없는 것은 아니다

    데이터 타입

    • 기본 타입(Primitive values)
      • Boolean
      • Null
      • Undefined
      • Number
      • String
      • Symbol(ECMAScript 6에 추가됨)
    • 객체(Objects)
    // Boolean
    
    const isTrue = true;
    const isFalse = false;
    
    console.log(isTrue, typeof isTrue);
    console.log(isFalse, typeof isFalse);
    
    const a = new Boolean(false);
    
    console.log(a, typeof a);
    
    if(a) {
        console.log('false?');
    }
    
    const b = Boolean(false);
    
    console.log(b, typeof b);
    
    if(b){
        console.log('false?');
    }

    →결과

    // Null
    
    const a = null;
    
    console.log(a, typeof a);
    
    // Undefined
    let b;
    
    console.log(b, typeof b);
    
    b = undefined;
    
    console.log(b);
    
    //null과 undefined는 비교하면 같다고 나옴
    if(a == b){
        console.log(a == b);
    }
    
    //===으로 비교하면 타입까지 비교함 false라서 if문 실행 안됨
    if(a === b){
        console.log(a === b);
    }

    →결과

    // Number
    
    const a = 37;
    
    console.log(a, typeof a);
    
    const b = 96.7;
    
    console.log(b, typeof b);
    
    const c = NaN; // NaN은 숫자가 아닌 Number형이라는 말이다.
    
    console.log(c, typeof c);
    
    const d = Number('Mark');
    
    console.log(d, typeof d);
    
    const e = Number('37');
    
    console.log(e, typeof e);

    →결과

     

    // String
    
    const a = 'Mark';
    
    console.log(a, typeof a);
    
    const b = "Mark" + ' Lee';
    
    const c = a + ' Lee';
    
    console.log(c, typeof c);
    
    const d = `$ Lee`;//백틱
    
    console.log(d, typeof d);

    →결과

     

    const a = Symbol();
    const b = Symbol(37);
    const c = Symbol('Mark');
    const d = Symbol('Mark');
    
    console.log(a, typeof a);
    console.log(c === d); //같은 인자를 넣어도 다른 심볼로 인식됨. 심볼은 고유한 것이다.
    
    new Symbol();// 심볼은 생성자로 만들어 질수가 없다

    →결과

     

 

 

 

 

 

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28
자바스크립트 출력  (0) 2021.03.12
자바스크립트의 위치  (0) 2021.03.12
자바스크립트 getElementById()  (0) 2021.03.12

CSS

  • link와 @import차이

    -link : html페이지에서 css를 불러올때 사용하는 것, 병렬호출

    -@import : css에서 다른 css파일을 불러올때 사용하는것, 직렬호출

CSS선택자

  • 기본선택자
    1. 전체선택자
    * {
      color: red;
    }
    <div>  <!--선택-->
      <ul>  <!--선택-->
        <li>사과</li>  <!--선택-->
        <li>딸기</li>  <!--선택-->
        <li>오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>  <!--선택-->
      <p>토마토</p>  <!--선택-->
      <span>오렌지</span>  <!--선택-->
    </div>

    전체를 선택해서 글자를 빨간색으로 적용한다.

    2. 태그 선택자

    li {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>  <!--선택-->
        <li>딸기</li>  <!--선택-->
        <li>오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span>오렌지</span>
    </div>

    3. 클래스 선택자

    .orange {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li class="orange">오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span class="orange">오렌지</span>  <!--선택-->
    </div>

    4.아이디 선택자

    #orange {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li id="orange" class="orange">오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span class="orange">오렌지</span>
    </div>

  • 복합 선택자

    1. 일치 선택자(E와 F를 동시에 만족하는 요소 선택)

    EF
    span.orange {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li class="orange">오렌지</li>
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span class="orange">오렌지</span>  <!--선택-->
    </div>

    2.자식 선택자(E의 자식 요소 F를 선택)

    E > F
    ul > .orange {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li class="orange">오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span class="orange">오렌지</span>
    </div>

    3.후손(하위) 선택자(E의 후손(하위) 요소 F를 선택),('띄어쓰기'가 선택자의 기호로 사용됩니다.)

    E F
    div .orange {
      color: red;
    }
    <div>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li class="orange">오렌지</li>  <!--선택-->
      </ul>
      <div>당근</div>
      <p>토마토</p>
      <span class="orange">오렌지</span>  <!--선택-->
    </div>

    4.인접형제 선택자(E의 다음 형제 요소 F 하나만 선택)

    E + F
    .orange + li {
      color: red;
    }
    <ul>
      <li>딸기</li>
      <li>수박</li>
      <li class="orange">오렌지</li>
      <li>망고</li>  <!--선택-->
      <li>사과</li>
    </ul>

    5.일반 형제 선택자(E의 다음 형제 요소 F 모두 선택)

    E ~ F
    .orange ~ li {
      color: red;
    }
    <ul>
      <li>딸기</li>
      <li>수박</li>
      <li class="orange">오렌지</li>
      <li>망고</li>  <!--선택-->
      <li>사과</li>  <!--선택-->
    </ul>

  • 가상클래스 선택자

    1. HOVER (E에 마우스(포인터)가 올라가 있는 동안에만 E 선택)

    E:hover
    a:hover {
      color: red;
    }
    <a href="http://www.naver.com">NAVER</a>

    2. ACTIVE (E를 마우스로 클릭하는 동안에만 E 선택)

    E:active
    div {
      width: 100px;
      height: 100px;
      background: tomato;
      transition: 0.4s;
    }
    div:active {
      width: 200px;
    }

    3. FOCUS (E가 포커스 된 동안에만 E 선택)

    E:focus
    input {
      width: 100px;
      outline: none;
      padding: 5px 10px;
      border: 1px solid lightgray;
      transition: 0.4s;
    }
    input:focus {
      width: 200px;
      border-color: red;
    }
    <input type="text">

    4. FIRST CHILD (E가 형제 요소 중 첫번째 요소라면 선택)

    E:first-child
    .fruits li:first-child {
      color: red;
    }
    <ul class="fruits">
      <li>딸기</li>  <!--선택-->
      <li>사과</li>
      <li>오렌지</li>
      <li>망고</li>
    </ul>

    5. LAST CHILD (E가 형제 요소 중 마지막 요소라면 선택)

    E:last-child
    .fruits li:last-child {
      color: red;
    }
    <ul class="fruits">
      <li>딸기</li>
      <li>사과</li>
      <li>오렌지</li>
      <li>망고</li>  <!--선택-->
    </ul>

    6. NTH CHILD (E가 형제 요소 중 n번째 요소라면 선택) (n 키워드 사용시 0부터 해석(Zero-base))

    E:nth-child(n)
    .fruits li:nth-child(2) {
      color: red;
    }
    <ul class="fruits">
      <li>딸기</li>
      <li>사과</li>  <!--선택-->
      <li>오렌지</li>
      <li>망고</li>
    </ul>

    두번째 요소만 선택

    .fruits li:nth-child(2n) {
      color: red;
    }
    <ul class="fruits">
      <li>딸기</li>
      <li>사과</li>  <!--선택-->
      <li>오렌지</li>
      <li>망고</li>  <!--선택-->
    </ul>

    짝수번째 요소만 선택

    .fruits li:nth-child(n+3) {
      color: red;
    }
    <ul class="fruits">
      <li>딸기</li>
      <li>사과</li>
      <li>오렌지</li>  <!--선택-->
      <li>망고</li>  <!--선택-->
    </ul>

    3번째 요소부터 이후요소들만 선택

    .fruits p:nth-child(1) {
      color: red;
    }
    <!--선택된 요소 없음-->
    <div class="fruits">
      <div>딸기</div>
      <p>사과</p>
      <p>망고</p>
      <span>오렌지</span>
    </div>

    .fruits의 첫번째 자식 요소가 <p></p>가 아니기 때문에 선택되지 않음.

    7. NTH OF TYPE (E의 타입(태그이름)과 동일한 타입인 형제 요소 중 E가 n번째 요소라면 선택)

    (n 키워드 사용시 0부터 해석(Zero-base))

    E:nth-of-type(n)
    .fruits .red:nth-of-type(1) {
      color: red;
    }
    <!--선택된 요소 없음-->
    <ul class="fruits">
      <li>오렌지</li>
      <li class="red">딸기</li>
      <li>망고</li>
      <li class="red">사과</li>
    </ul>

    2번쨰와 4번째에 있는 .red 요소의 타입(태그이름)은 li 이기 때문에, :nth-of-type(1)선택자는

    <li></li> 들 중에서 첫번째 요소를 선택하고 .red인지 체크하게 된다. 따라서 조건에 맞는 요소가 없으므로 선택되지 않는다.

    8. 부정선택자 (S가 아닌 E 선택)

    E:not(S)
    .fruits li:not(.strawberry) {
      color: red;
    }
    <ul class="fruits">
      <li>오렌지</li>  <!--선택-->
      <li class="strawberry">딸기</li>
      <li>망고</li>  <!--선택-->
      <li>사과</li>  <!--선택-->
    </ul>

  • 가상요소 선택자
    1. BEFORE (E 요소 내부의 앞에, 내용(content)을 삽입)
    E::before
    ul li:before { /* support IE 8 */
      content: "$";
    }
    ul li::before {
      content: "$";
    }
    <ul>
      <li>1</li>  <!-- $1 -->
      <li>2</li>  <!-- $2 -->
      <li>3</li>  <!-- $3 -->
      <li>4</li>  <!-- $4 -->
    </ul>

    각<li></li> 내부의 앞에 내용(content)으로 $문자를 삽입했다.

    내용을 넣기 위해서는 content 속성이 필수이다.

    div::before {
      content: url("../images/smile.png");
    }

    url()을 통해서 이미지를 삽입할수 있다.

    2. AFTER (E 요소 내부의 뒤에, 내용(content)을 삽입)

    E::after
    ul li:after { /* support IE 8 */
      content: ".0";
    }
    ul li::after {
      content: ".0";
    }
    <ul>
      <li>1</li>  <!-- 1.0 -->
      <li>2</li>  <!-- 2.0 -->
      <li>3</li>  <!-- 3.0 -->
      <li>4</li>  <!-- 4.0 -->
    </ul>

    각 <li></li> 내부의 뒤에 내용(content)으로 .0문자를 삽입했다.

  • 속성 선택자
    1. ATTR (속성 attr을 포함한 요소 선택)
      [attr]
      [disabled] {
        opacity: 0.2;
      }
      <input type="text" value="HEROPY">
      <input type="password" value="1234">
      <input type="text" value="disabled text" disabled>

    2. ATTR=VALUE (속성 attr을 포함하며 속성 값이 value인 요소 선택)

    [attr=value]
    [type="password"] {
      color: red;
    }
    <input type="text" value="HEROPY">
    <input type="password" value="1234">
    <input type="text" value="disabled text" disabled>

    3. ATTR^=VALUE (속성 attr을 포함하며 속성 값이 value로 시작하는 요소 선택)

    [attr^=value]
    [class^="btn-"] {
      font-weight: bold;
      border-radius: 4px;
    }
    <button class="btn-success">Success</button>
    <button class="btn-danger">Danger</button>
    <button>Normal</button>

    4. ATTR$=VALUE (속성 attr을 포함하며 속성 값이 value로 끝나는 요소 선택)

    [attr$=value]
    [class^="btn-"] {
      font-weight: bold;
      border-radius: 4px;
    }
    [class$="success"] {
      color: green;
    }
    [class$="danger"] {
      color: red;
    }
    <button class="btn-success">Success</button>
    <button class="btn-danger">Danger</button>
    <button>Normal</button>

  • 상속
    .ecosystem {
      color: red;
    }
    <div class="ecosystem">생태계  <!--RED-->
      <div class="animal">동물  <!--RED-->
        <div class="tiger">호랑이</div>  <!--RED-->
        <div class="lion">사자</div>  <!--RED-->
        <div class="elephant">코끼리</div>  <!--RED-->
      </div>
      <div class="plant">식물</div>  <!--RED-->
    </div>

    생태계(.ecosystem)에 적용된 색상이, 하위 요소들에게도 적용되었습니다.

    • 상속되는 속성들(properties)
      • font
        • font-style
        • font-weight
        • font-size
        • line-height
        • font-family
      • color
      • text-align
      • text-indent
      • text-decoration
      • letter-spacing
      • opacity

    강제상속

    <div class="parent">
      <div class="child"></div>
    </div>
    .parent {
      position: absolute;  /* 상속되지 않는 속성과 값 */
    }
    .child {
      position: inherit;  /* 강제 상속 받아 position: absolute; 와 동일 */
    }

    상속되지 않는 속성(값)도 inherit 이라는 값을 사용하여 '부모'에서 '자식'으로 강제 상속시킬 수 있습니다. '자식'를 제외한 '후손'에게는 적용되지 않으며, 모든 속성이 강제 상속을 사용할 수 있는 것은 아닙니다.

  • 우선순위
    <body>
      <!--인라인 선언방식-->
      <div id="color_yellow" class="color_green" style="color: orange;">Hello world!</div>
    </body>
    div { color: red !important; }  /* !important */
    
    #color_yellow { color: yellow; }  /* 아이디 선택자 */
    
    .color_green { color: green; }  /* 클래스 선택자 */
    
    div { color: blue; }  /* 태그 선택자 */
    
    * { color: darkblue; }  /* 전체 선택자 */
    
    body { color: violet; }  /* 상속 */

    우선순위 결정

    같은 요소가 여러 선언의 대상이 될 경우, 어떤 선언의 CSS속성을 우선적용할지 결정하는 방법

    1. 명시도 점수가 높은 선언이 우선(명시도)
    1. 점수가 같은경우, 가장 마지막에 해석되는 선언이 우선(선언순서)
    1. 명시도는 '상속'규칙보다 우선(중요도)
    1. !important가 적용된 선언방식이 다른 모든 방식보다 우선(중요도)

    1. 가장중요(!important)

    모든 선언을 무시하고 가장 우선

    점수 : 무한pt

    div {
      color: red !important; /* 가장 우선 */
    }

    2.인라인 선언 방식

    인라인 선언(HTML style 속성을 사용)

    점수: 1000px

    <div style="color: orange;">HELLO WORLD</div>  <!-- 1,000pt -->

    3. 아이디

    아이디 선택자

    점수: 100pt

    #color_yellow {
      color: yellow;  /* 100pt*/
    }

    4. 클래스()

    클래스 선택자

    점수 : 10pt

    .color_green {
      color: green;  /* 10pt */
    }

    5. 태그

    태그 선택자

    점수 : 1pt

    span{
    color:blue; /* 1pt */

    6. 전체

    전체 선택자

    점수 : 0pt

    * {
      color: darkblue;  /* 0pt */
    }

    7. 상속

    상속받은 속성은 항상 우선하지 않음

    점수 : 계산하지 않음

    body {
      color: violet;
    }

    계산해보기!

    .list li.item { color: red; }  /* 21pt */
    
    .list li:hover { color: red; }  /* 21pt */
    
    .box::before { content: "Good "; color: red; }  /* 11pt */
    
    #submit span { color: red; }  /* 101pt */
    
    header .menu li:nth-child(2) { color: red; }  /* 22pt */
    
    h1 { color: red; }  /* 1pt */
    
    :not(.box) { color: red; }  /* 10pt */
    
    :not(span) { color: red; }  /* 1pt */

    :hover 처럼 '가상 클래스'는 '클래스' 선택자의 점수(10pt)를 가지며, ::before 처럼 '가상 요소'는 '태그' 선택자의 점수(1pt)를 가진다. 부정 선택자 :not()은 점수를 가지지 않는다.

CSS단위

  • px

  • %
  • em

    자기자신의 font-size에 영항을 받음

    font-size는 상속이 되서 계속 자식의 자식으로 자동으로 넘어간다. → .parent와 .child에 font-size:10px;가 정의 되어있다고 생각하고 봐야함.

    em은 font-size * em앞에 숫자 한것이 결과 값 이라고 봐야함

    font-size가 10px이고 em이 30em이라면 10*30의 결과인 300이 값이고 뒤에는 자동으로 px이 붙어서 300px이 된다

  • rem
  • vw vh
  • vmin vmax

    vmax

    vmin

CSS속성

  • width(요소의 가로 너비를 지정)

    사용법

    width: 크기;
    .box {
      width: 100px;
    }
  • height

    사용법

    height: 크기;
    .box {
      height: 100px;
    }
    .block-element {
      display: block;
      width: auto;  /* 100% 동등 */
      height: auto;  /* 0 동등 */
    }
    .inline-element {
      display: inline;
      width: auto;  /* 0 동등 */
      height: auto;  /* 0 동등 */
    }
  • max-width(요소의 최대 가로 너비를 지정)
  • min-width(요소의 최소 가로 너비를 지정)
  • max-height(요소의 최대 세로 너비를 지정)

  • min-height(요소의 최소 세로 너비를 지정)

  • margin(요소의 외부 여백을 지정)

    음수값 사용가능

    사용법

    margin: 위 우 아래 좌;
    margin: 위 [좌,우] 아래;
    margin: [위,아래] [좌,우];
    margin: [위,아래,,우];
    .box {
      margin: 10px 20px 30px 40px;
      margin: 10px 20px 40px;
      margin: 10px 40px;
      margin: 10px;
    }

    자식에서 마진을 %로 주면 부모의 넓이의 %만큼 적용된다

    • margin-top(요소의 '외부(바깥) 위쪽 여백'을 지정)
    • margin-bottom(요소의 '외부(바깥) 아래쪽 여백'을 지정)
    • margin-left(요소의 '외부(바깥) 왼쪽여백'을 지정)
    • margin-right(요소의 '외부(바깥) 오른쪽여백'을 지정)
    .box1 {
      margin: 10px 20px 30px 40px;  /* 단축속성 */
    }
    .box2 {
      /* 개별속성 */
      margin-top: 10px;
      margin-right: 20px;
      margin-bottom: 30px;
      margin-left: 40px;
    }
  • margin - 중복(마진의 특정 값들이 '중복'되어 합쳐지는 현상)
    1. 형제 요소들의 margin-top과 margin-bottom이 만났을 때
    1. 부모 요소의 margin-top과 자식 요소의 margin-top이 만났을 때
    1. 부모 요소의 margin-bottom과 자식 요소의 margin-bottom이 만났을 때

    • 형제 요소에 발생하는 마진 중복 해결(각 형제 요소에 float 속성이 있을 경우)
      <div class="box_group">
        <div class="box"></div>
        <div class="box"></div>
      </div>
      .box_group {
        width: 240px;
      }
      .box {
        width: 200px;
        height: 100px;
        background: red;
        margin: 20px;
        float: left; /* 중복 해결 */
      }
  • padding(요소의 '내부(안) 여백'을 지정)

    사용법

    padding: 위 우 아래 좌;
    padding: 위 [좌,우] 아래;
    padding: [위,아래] [좌,우];
    padding: [위,아래,,우];
    .box {
      padding: 10px 20px 30px 40px;
      padding: 10px 20px 40px;
      padding: 10px 40px;
      padding: 10px;
    }

    • padding-top(요소의 '내부(안) 위쪽 여백'을 지정)
    • padding-bottom(요소의 '내부(안) 아래쪽 여백'을 지정)
    • padding-left(요소의 '내부(안) 왼쪽 여백'을 지정)
    • paddint-right(요소의 '내부(안) 오른쪽여백'을 지정)

    .box1 {
      padding: 10px 20px 30px 40px;  /* 단축속성 */
    }
    .box2 {
      /* 개별속성 */
      padding-top: 10px;
      padding-right: 20px;
      padding-bottom: 30px;
      padding-right: 40px;
    }
    • 크기증가(추가된 padding 값만큼 요소의 크기가 커지는 현상)
      /* 100 x 100(px) 크기의 요소 만들기 */
      .box {
        width: 60px; /* +40px */
        height: 80px; /* +20px */
        background: red;
        padding: 10px 20px;
      }

      padding이 추가된 값만큼 width와 height 값을 다시 계산합니다.

  • border(요소의 '테두리 선'을 지정)

    사용법

    border: 두께 종류 색상;
    .box {
      border: 1px solid red;
    }
    • border-width(선의 두께(너비)를 지정)

      사용법

      border-width: 위 우 아래 좌;
      border-width: 위 [좌,우] 아래;
      border-width: [위,아래] [좌,우];
      border-width: [위,아래,,우];
      .box {
        border-width: 10px 20px 30px 40px;
        border-width: 10px 20px 40px;
        border-width: 10px 40px;
        border-width: 10px;
      }

    • border-style(선의 종류를 지정)

      선종류보기

      사용법

      border-style: 위 우 아래 좌;
      border-style: 위 [좌,우] 아래;
      border-style: [위,아래] [좌,우];
      border-style: [위,아래,,우];
      .box {
        border-style: solid dotted double inset;
        border-style: solid dotted inset;
        border-style: solid inset;
        border-style: solid;
      }

    • border-color(선의 색상을 지정)

      사용법

      border-color: 위 우 아래 좌;
      border-color: 위 [좌,우] 아래;
      border-color: [위,아래] [좌,우];
      border-color: [위,아래,,우];
      .box {
        border-color: red blue #fff rgba(0,0,0,.5);
        border-color: red blue rgba(0,0,0,.5);
        border-color: red rgba(0,0,0,.5);
        border-color: red;
      }
    • 기타속성

    • box-sizing(요소의 크기 계산 기준을 지정)

    • display(요소의 박스 타입(유형)을 설정)

  • overflow(요소의 크기 이상으로 내용(자식요소)이 넘쳤을 때, 내용의 보여짐을 제어)

    사용법

    overflow: 보여짐제어;
    <div class="parent">
      <div class="child"></div>
    </div>
    .parent {
      width: 200px;
      height: 200px;
      background: yellow;
      overflow: hidden;
    }
    .child {
      width: 100px;
      height: 300px;
      background: red;
    }

'HTML&CSS' 카테고리의 다른 글

드롭다운 navbar 만들기<ul> <li>  (0) 2021.02.28

자바스크립트는 여러가지 방법으로 출력할수 있다

  • HTML 요소에 innerHTML사용
  • HTML 출력으로 document.write()사용
  • 경고창 띄우기, window.alert()
  • 브라우저 콘솔창에 쓰기, console.log()

* innerHTML사용

HTML요소에 접근하기 위해서는 document.getElementById(id)를 사용해야된다

id는 HTML의 요소를 의미하고 innerHTML은 HTML의 내용을 정의한다.

 

예시 코드

<!DOCTYPE html>
<html>
<body>

<h2>My First Web Page</h2>
<p>My First Paragraph.</p>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 + 6;
</script>

</body>
</html> 

결과

* document.write() 사용

예시 코드

<!DOCTYPE html>
<html>
<body>

<h2>My First Web Page</h2>
<p>My first paragraph.</p>

<p>Never call document.write after the document has finished loading.
It will overwrite the whole document.</p>

<script>
document.write(5 + 6);
</script>

</body>
</html> 

 

결과

 

*유의할점!

document.write는 페이지가 다 로딩 된후에 사용하게 되면 페이지에 있는 html이 다 지워지게 된다.

 

예시 코드

<!DOCTYPE html>
<html>
<body>

<h2>My First Web Page</h2>
<p>My first paragraph.</p>

<button type="button" onclick="document.write(5 + 6)">Try it</button>

</body>
</html> 

결과 화면

document.write()를 호출하기전
document.write()를 호출하고 난 후

 

* window.alert() 사용

window.alert()를 사용하게 되면 경고창을 띄우게 된다

 

예시코드

<!DOCTYPE html>
<html>
<body>

<h2>My First Web Page</h2>
<p>My first paragraph.</p>

<script>
window.alert(5 + 6);
</script>

</body>
</html> 

 

결과 화면

* console.log() 사용

예시코드

<!DOCTYPE html>
<html>
<body>

<h2>Activate Debugging</h2>

<p>F12 on your keybord will activate debugging.</p>
<p>Then select "Console" in the debugger menu.</p>
<p>Then click Run again.</p>

<script>
console.log(5 + 6);
</script>

</body>
</html> 

 

결과 화면

f12를 누른 화면

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25
자바스크립트의 위치  (0) 2021.03.12
자바스크립트 getElementById()  (0) 2021.03.12

자바스크립트의 위치는 HTML의 <body>와 <head>에 위치할수 있다.

 

먼저 <head>안에 위치할때의 모습을 보자

<!DOCTYPE html>
<html>
<head>
<script>
function myFunction() {
  document.getElementById("demo").innerHTML = "Paragraph changed.";
}
</script>
</head>
<body>

<h2>JavaScript in Head</h2>

<p id="demo">A Paragraph.</p>

<button type="button" onclick="myFunction()">Try it</button>

</body>
</html> 

 

<button type="button" onclick="myFunction()">Try it</button> 이부분에서 버튼을 클릭하면 myFunction()을 호출해주고  이걸로 인해서 <head>안에존재하는 myFunction이 실행되서 demo라는 아이디를 가지고있는 태그안의 내용이 변하게 된다.

 

실행전 

 

실행후

다음은 <body>안에 존재할때의 경우이다

<!DOCTYPE html>
<html>
<body>

<h1>A Web Page</h1>
<p id="demo">A Paragraph</p>
<button type="button" onclick="myFunction()">Try it</button>

<script>
function myFunction() {
  document.getElementById("demo").innerHTML = "Paragraph changed.";
}
</script>

</body>
</html>

 

실행 흐름은 <head>안에 있을때와 동일하다 하지만 여기서 차이점은 <body> 안에 위치하게 하는것이 <head>안에 위치한것 보다 실행 속도가 빠르다는 것이다.

 

추가적으로 자바스크립트는 별도의 파일로 만들어져서 동작할수도 있다.

코드부터 한번 살펴보자

<!DOCTYPE html>
<html>
<body>

<h2>External JavaScript</h2>

<p id="demo">A Paragraph.</p>

<button type="button" onclick="myFunction()">Try it</button>

<p>(myFunction is stored in an external file called "myScript.js")</p>

<script src="myScript.js"></script>

</body>
</html>

코드에서 보면 myFunction()이라는 함수를 호출은 하는데 코드상에는 존재하지 않는것을 볼수 있다.

대신

이 부분에서 외부에 만들어져있는 myFunction()을 호출하면 실행되는 기능을 정의해 놓은 코드가 있는 파일을 호출해준다.

 

외부에서 자바스크립트 파일을 불러오는 방식의 장점

- html과 코드랑 서로 분리 되어 있다

- html과 javascript를 더 읽기 쉽고 유지보수하기 쉽게 만들어 준다

- 파일을 불러오는 방식이 페이지 로딩 속도를 더 빠르게 할수 있다.

 

외부에서 자바스크립트 파일을 불러오는 방법

 

1.링크형식으로 할때는 URL을 적어줘야한다.

2. 스크립트가 위치한 경로를 적어준다.

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25
자바스크립트 출력  (0) 2021.03.12
자바스크립트 getElementById()  (0) 2021.03.12

먼저 getElementById()라는 메서드를 알아보겠다.

말그대로 getElementById()는 id로 element를 가져온다 라는뜻

 

코드

<!DOCTYPE html>
<html>
<body>

<h2>What Can JavaScript Do?</h2>

<p id="demo">JavaScript can change HTML content.</p>

<button type="button" onclick='document.getElementById("demo").innerHTML = "Hello JavaScript!"'>Click Me!
</button>

</body>
</html>

실행 전 모습

실행 후 모습

 

위의 코드에서 보았듯이 <p>태그의 id가 demo인걸 알수있고 버튼을 클릭하면 onclick='document.getElementById("demo").innerHTML = "Hello JavaScript!"' 이부분에 의해서 p태그 안의 내용이 바뀌는걸 알수 있다.

 

 

텍스트 뿐만 아니라 이미지 태그도 적용가능하다

 

코드

 

<!DOCTYPE html>
<html>
<body>

<h2>What Can JavaScript Do?</h2>

<p>JavaScript can change HTML attribute values.</p>

<p>In this case JavaScript changes the value of the src (source) attribute of an image.</p>

<button onclick="document.getElementById('myImage').src='pic_bulbon.gif'">Turn on the light</button>

<img id="myImage" src="pic_bulboff.gif" style="width:100px">

<button onclick="document.getElementById('myImage').src='pic_bulboff.gif'">
	Turn off the light
</button>

</body>
</html>

실행전 모습

실행후 모습

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25
자바스크립트 출력  (0) 2021.03.12
자바스크립트의 위치  (0) 2021.03.12

Spring Boot + JSP + MyBatis를 사용해서 회원가입 로그인까지 구현해보았다.

 

우선 메인페이지

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<!-- <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"> -->
<!-- <link href="/css/bootstrap-theme.css" rel="stylesheet" type="text/css"> -->
<!-- <link href="/css/index.css" rel="stylesheet" type="text/css"> -->

<jsp:include page="/WEB-INF/views/include/head.jsp"></jsp:include>
</head>
<body>
<jsp:include page="/WEB-INF/views/include/navbar.jsp"></jsp:include>
<div align="center">

</div>


<script src="/script/jquery-3.5.1.js"></script>
<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>

</script>
</body>
</html>

head.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<meta charset="UTF-8">

<link href="/css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="/css/bootstrap-theme.css" rel="stylesheet" type="text/css">
<link href="/css/index.css" rel="stylesheet" type="text/css">

navbar.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<header>
		<div class="container">
			<div class="row">
				<div class="col-md-2 cont">
					<img width='200' src="/imgs/library.jpg" />
				</div>
				<div class="col-md-6">
					<h3 class="title"><a href="/">중앙도서관</a></h3>
				</div>
				<div class="col-md-3">
					<div class="login">

					<c:set var = "id" value="${id }"/>
					<c:if test ="${id != null }">
						<span>${id }님 어서오세요</span>
						<span>/</span>
						<span><a href="/member/logout">로그아웃</a></span>
					</c:if>
					<c:if test="${id == null }">
					<span><a href="/member/login">로그인</a></span>
						<span>/</span>
						<span><a href="/member/join">회원가입</a></span>
					</c:if>

					</div>
				</div>
			</div>
		</div>

		<nav role="navigation">
			<ul id="main-menu">
				<li><a href="#">MENU1</a></li>
				<li><a href="#">Menu2</a>
					<ul id="sub-menu">
						<li><a href="">submenu</a></li>
						<li><a href="">submenu</a></li>
						<li><a href="">submenu</a></li>
						<li><a href="">submenu</a></li>
					</ul></li>
				<li><a href="#">MENU3</a></li>
				<li><a href="#">MENU4</a></li>
				<li><a href="#">MENU5</a></li>
				<li><a href="#">MENU6</a></li>
			</ul>
		</nav>

</header>

 

일차적으로 대충 필요한것?만 만들어 놓고 추후에 추가할 예정이다.

 

먼저 로그인 하는데 필요한 아이디를 생성하기 위해서 회원가입 기능을 만들어 보자.

 

회원가입 화면

코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<!-- <link href="/css/bootstrap.css" rel="stylesheet" type="text/css"> -->
<!-- <link href="/css/bootstrap-theme.css" rel="stylesheet" type="text/css"> -->
<!-- <link href="/css/index.css" rel="stylesheet" type="text/css"> -->
<jsp:include page="/WEB-INF/views/include/head.jsp"></jsp:include>
</head>
<body>
<jsp:include page="/WEB-INF/views/include/navbar.jsp"></jsp:include>
<div align="center">
    <form action="/member/register" method="post" name="frm" onsubmit="return submitCheck();">
        <table width="800">
            <tr height="40">
                <td align="center"><b>[회원가입]</b></td>
            </tr>
        </table>
        <table width="700" height="600" cellpadding="0" style="border-collapse:collapse; font-size:9pt;">
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">회원 ID</td>
                <td><input type="text" name="id" /><span id="idDupChk"></span></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">비밀번호</td>
                <td><input type="password" name="pw" class="pass1" id="pw" onchange="isSame()" /></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">비밀번호 확인</td>
                <td><input type="password" name="wUserPWConfirm" class="pass2" id="pwCheck" onchange="isSame()" />&nbsp;&nbsp;<span id="msgPass"></span></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">이 름</td>
                <td><input type="text" name="name" /></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">성 별</td>
                <td>
                   	<select name="gender" required>
                   		<option value="남자" id="man">남자</option>
                   		<option value="여자" id="women">여자</option>
                   	</select>
                </td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">집전화</td>
                <td><input type="text" name="tel" /></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">휴대전화</td>
                <td><input type="text" name="tel2" /></td>
            </tr>

            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">생년월일</td>
                <td>
	                <span>
	                	<input type="text" style="width:60px" name="yy" maxlength="4" placeholder="년(4자)" required />
	                </span>
	                <span>
	                	<select name="mm" id="mm">
	                		<option value="1">1</option>
	                		<option value="2">2</option>
	                		<option value="3">2</option>
	                		<option value="4">3</option>
	                		<option value="5">4</option>
	                		<option value="6">5</option>
	                		<option value="7">6</option>
	                		<option value="8">7</option>
	                		<option value="9">8</option>
	                		<option value="10">10</option>
	                		<option value="11">11</option>
	                		<option value="12">12</option>
	                	</select>
	                </span>
	                <input type="text" placeholder="일" name="dd" id="dd" style="width : 30px"/>
                </td>
            </tr>

            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr class="register" height="30">
                <td width="5%" align="center">*</td>
                <td width="15%">이메일</td>
                <td><input type="email" name="email" /></td>
            </tr>
            <tr height="7">
                <td colspan="3"><hr /></td>
            </tr>
            <tr>
                <td width="5%" align="center">*</td>
                <td width="15%">주 소</td>
                <td>
                    <input type="text" id="sample4_postcode" name = "postcode" placeholder="우편번호">
					<input type="button" onclick="sample4_execDaumPostcode()" value="우편번호 찾기"><br>
					<input type="text" id="sample4_roadAddress" name="address" placeholder="도로명주소" size="60" ><br>
					<input type="hidden" id="sample4_jibunAddress" placeholder="지번주소"  size="60">
					<span id="guide" style="color:#999;display:none"></span>
					<input type="text" id="sample4_detailAddress" name="address2" placeholder="상세주소"  size="60"><br>
					<input type="hidden" id="sample4_extraAddress" placeholder="참고항목"  size="60">
					<input type="hidden" id="sample4_engAddress" placeholder="영문주소"  size="60" ><br>
                </td>
            </tr>

        </table>
        <br />
        <table>
            <tr height="40">
                <td><input type="submit" id="join" value="가입하기" /></td>
            </tr>
        </table>
    </form>
</div>


<script src="/script/jquery-3.5.1.js"></script>
<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
    //본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라, 내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을 설명합니다.
    function sample4_execDaumPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var roadAddr = data.roadAddress; // 도로명 주소 변수
                var extraRoadAddr = ''; // 참고 항목 변수

                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                    extraRoadAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment === 'Y'){
                   extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                if(extraRoadAddr !== ''){
                    extraRoadAddr = ' (' + extraRoadAddr + ')';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample4_postcode').value = data.zonecode;
                document.getElementById("sample4_roadAddress").value = roadAddr;
                document.getElementById("sample4_jibunAddress").value = data.jibunAddress;

                document.getElementById("sample4_engAddress").value = data.addressEnglish;

                // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
                if(roadAddr !== ''){
                    document.getElementById("sample4_extraAddress").value = extraRoadAddr;
                } else {
                    document.getElementById("sample4_extraAddress").value = '';
                }

                var guideTextBox = document.getElementById("guide");
                // 사용자가 '선택 안함'을 클릭한 경우, 예상 주소라는 표시를 해준다.
                if(data.autoRoadAddress) {
                    var expRoadAddr = data.autoRoadAddress + extraRoadAddr;
                    guideTextBox.innerHTML = '(예상 도로명 주소 : ' + expRoadAddr + ')';
                    guideTextBox.style.display = 'block';

                } else if(data.autoJibunAddress) {
                    var expJibunAddr = data.autoJibunAddress;
                    guideTextBox.innerHTML = '(예상 지번 주소 : ' + expJibunAddr + ')';
                    guideTextBox.style.display = 'block';
                } else {
                    guideTextBox.innerHTML = '';
                    guideTextBox.style.display = 'none';
                }
            }
        }).open();
    }
</script>
<script type="text/javascript">

let isID=false;
let isPw=false;
let isEmail=false;

$('input[name="id"]').keyup(function () {
	let id = $(this).val();
	console.log(id);

	//id길이가 2보다 작으면 중복체크 안함
	if(id.length<2){
		return
	}

	$.ajax({
		url: '/member/ajax/dupCheck',
		data : {id : id},
		dataType : 'json',
		success : function(response) {
			if(response.idIdDup){
				$('span#idDupChk').html('이미 사용중인 아이디 입니다.').css('color', 'red');
				isId = false;
			}
			else {
				$('span#idDupChk').html('사용가능한 아이디 입니다.').css('color', 'blue');
				isId = true;
			}
		}
	});
});


	//.pass2 요소에 포커스가 해제되면
	$('.pass2').focusout(function () {
		let pass1 = $('.pass1').val();
		let pass2 = $(this).val();

		if (pass1 == pass2) {
			$('#msgPass').html('패스워드 일치함').css('color', 'green');
			isPw=true;
		} else {
			$('#msgPass').html('패스워드 불일치').css('color', 'red');
			isPw=false;
		}
	});
	$('input[id="join"]').click(function submitCheck(){
		if( isId==false){
			alert("아이디가 중복입니다.");
			return false;
		}else if(isPw==false){
			alert("비밀번호가 다릅니다!");
			return false;
		}else
			true;
	})
</script>
</body>
</html>

가입하기 버튼을 누르면

 

post방식으로 요청을 하기 때문에

MemberController.java라는 컨트롤러에서

@PostMapping("/register")
	public String register(MemberVo memberVo) {
		log.info("post register 호출됨");

		memberVo.setRegDate(new Timestamp(System.currentTimeMillis()));
		log.info("memberVo : " + memberVo);

		//회원가입 처리
		memberService.addMember(memberVo);

		return "redirect:/";
	}

이부분이 처리를 해준다.

 

addMember(memberVo)부분 코드

public void addMember(MemberVo memberVo) {
		memberMapper.addMember(memberVo);
	}

memberMapper.addMember(memberVo)부분 코드

@Insert("Insert INTO member (id, pw, name, gender, yy,mm,dd,tel,tel2,email,postcode,address,address2,regdate)"
			+ "values(#{id}, #{pw}, #{name}, #{gender}, #{yy}, #{mm}, #{dd}, #{tel}, #{tel2}, #{email}, #{postcode}, #{address}, #{address2}, CURRENT_TIMESTAMP)")
	void addMember(MemberVo memberVo);

여기 까지 되면 회원가입이 완료가 된다.

'프로젝트' 카테고리의 다른 글

밀키트 쇼핑몰 프로젝트(2)  (0) 2021.02.27
밀키트 쇼핑몰 프로젝트(1)  (0) 2021.02.27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고링크 : blog.naver.com/PostView.nhn?blogId=degal903&logNo=221358939762&parentCategoryNo=&categoryNo=49&viewDate=&isShowPopularPosts=true&from=search

 

 

HTML/CSS기초_drop down 메뉴 만들기 1

안녕하세요. 그림젤입니다...웹 세상은 정말 수시로 변하고 있어요.... 그러니 옛날에 배웠던 CSS를 ...

blog.naver.com

 

'HTML&CSS' 카테고리의 다른 글

HTML/CSS내용 정리  (0) 2021.03.21

실행 흐름

OOO.do라는 것이 호출 되었을 때.

1. FrontController.java

		  // 이런류의 url사이트 처리, 시작하기전에 미리 준비 1순위로
@WebServlet(urlPatterns = "*.do", loadOnStartup = 1)
public class FrontController extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 호출됨");
		
		// application 객체 가져와서 필요한 데이터 저장
		ServletContext application = config.getServletContext();
		application.setAttribute("aa", "안녕");
		String hello = (String) application.getAttribute("aa");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() 호출됨");
		
		// 요청 주소
		// http://localhost:80/funweb-model2/index.do
		//					  > 이 이후 부분이 URI, 실제웹서비스를하면 유일한 주소여야함
		//						위치를 나타내는 것이 아니라 식별하는 부분, 통상적으로 URL이라고 얘기를 하지만 정확하게는 URI		
		// http://localhost:80/index.do
					  
		/* 1단계) 명령어 command 구하기 */
		// URI 주소 가져오기
		String requestURI = request.getRequestURI();
		System.out.println("URI 주소: " + requestURI);
			// URI 주소: /funweb-model2/index.do
		
		// 프로젝트 이름 경로 가져오기
		String contextPath = request.getContextPath(); // 없으면 빈문자열 "" 들어옴
		System.out.println("contextPath: " + contextPath);
			// contextPath: /funweb-model2
		
		// 요청 명령어 구하기
		String command = requestURI.substring(contextPath.length());
			// command: /index.do
		command = command.substring(0, command.indexOf(".do"));
		System.out.println("command: " + command);
			// command: /index
		
		
		/* 2단계) 명령어 실행하기 */ // << 요눔을 우리가 코딩(키맵)
		// 이런식(if else)로하면 필요없는코드도 다 노출되어서 좋은게 아님
		Controller controller = null;
		ControllerFactory factory = ControllerFactory.getInstance(); // new! 객체생성은 동시접속자를 고려해야함 -> 중요한 싱글톤 
		String strView = null;								 // 한번 뉴로등록한 컨트롤러객체는 자체가 싱글톤이라 걍 꺼내쓰면됨 
															 // 그치만 컨트롤러팩토리는 아니니가 싱글톤 해줘야겠지
		// 명령어에 해당하는 컨트롤러 객체 구하기						
		controller = factory.getController(command);
		if (controller  == null) {
			System.out.println(command + "를 처리하는 컨트롤러가 없습니다.");
			return; // return이니까 여까지하구 서버끝남
		}
		
		try {
			// 키맵에서의 new 어쩌구Controller에 해당하는 컨트롤러 객체 실행하기
			strView = controller.execute(request, response); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		/* 3단계) 화면응답(jsp실행) 또는 리다이렉트(.do) 이동 */
		if (strView == null) {
			System.out.println("이동할 화면정보(View)가 없습니다.");
			return;
		}
		
		if (strView.startsWith("redirect:")) { // .do로 끝나는 경로
			String redirectPath = strView.substring("redirect:".length());
			response.sendRedirect(redirectPath);
								// index.do?
		} else {										// index.jsp?
			String jspPath = "/WEB-INF/views/" + strView + ".jsp";
			RequestDispatcher dispatcher = request.getRequestDispatcher(jspPath);
			dispatcher.forward(request, response); // 해당 jsp 바로 실행하기 ( 갔다오는 리다이렉트랑은 다름 )
		}
		
		
	} // doGet

2.ControllerFactory.java

//컨트롤러마다 생성자를 프라이빗으로 감추고 세터게터하기 좀 에바니까 싱글톤으로 관리함
public class ControllerFactory {
	/* 싱글톤, 스프링가면 애노테이션 한개로 해결가능 */
	private static ControllerFactory instance = new ControllerFactory();

	public static ControllerFactory getInstance() {
		return instance;
	}
	//////////////////////////////////////////////////////////// 맵을 한개 선언
	private Map<String, Controller> map = new HashMap<>();

	private ControllerFactory() {
		// 키값은 .do로 끝나는 요청 URL주소의 일부 - 명령어

		// 명령어와 명령어를 처리하는 컨트롤러 객체를 쌍으로 등록
		// 사용자로부터 "" 이러한 요청이오면 new ~ 가 실행된다!
		map.put("/index", new IndexController());

		// user
		map.put("/userJoin", new UserJoinController());
		map.put("/joinIdDupCheck", new JoinIdDupCheckController());
		map.put("/userJoinPro", new UserJoinProController());
		map.put("/userLogin", new UserLoginController());
		map.put("/userLoginPro", new UserLoginProController());
		map.put("/userLogout", new UserLogoutController());
		map.put("/MyPage", new MyPageController());
		map.put("/UserUpdate", new UserUpdateController());
		map.put("/UserUpdatePro", new UserUpdateProController());
		map.put("/UserDelete", new UserDeleteController());
        	} // 생성자

	public Controller getController(String command) {
		// Map 컬렉션: 키값없는, 존재하지않는 값을 꺼내면 null을 리턴함
		Controller controller = map.get(command);
		return controller;
	}
}

'프로젝트' 카테고리의 다른 글

도서관 회원가입 로그인(1)  (0) 2021.03.08
밀키트 쇼핑몰 프로젝트(1)  (0) 2021.02.27

MVC2패턴과 MVC모델1 패턴이 섞여있다ㅠ

MVC모델이란?

'프로젝트' 카테고리의 다른 글

도서관 회원가입 로그인(1)  (0) 2021.03.08
밀키트 쇼핑몰 프로젝트(2)  (0) 2021.02.27

+ Recent posts