1.  오브젝트  Object

👩🏻‍💻  오브젝트 object를 사용하면 클래스를 생성자로 인스턴스화 하지 않아도 블록 안의 프로퍼티와 메서드를 호출해서 사용할 수 있다.  ➡️ 자바의 static과 같은 역할
👩🏻‍💻  object 코드 블록 안의 프로퍼티와 메서드는 클래스명에 점 연산자를 붙여서 생성자 없이 직접 호출
👩🏻‍💻  주의할 점은 클래스명을 그대로 사용하기 때문에 호출하는 클래스명의 첫 글자가 대문자


1) 컴패니언 오브젝트


  👾  일반 클래스에 object 기능을 추가하기 위해서 사용
  👾  클래스 코드 안에 companion object 블록으로 감싸주면 생성 과정 없이 오브젝트처럼 사용할 수 있음

object Cat {
    var name: String ="pinky"
    fun printName() {
        println("Cat의 이름은 ${name}입니다.")
    }
}

class Dog {
    companion object {
        var name: String = "None"
        fun printName() {
            println("Dog 이름은 ${name}입니다.")
        }
    }
    fun walk() {
        println("Dog가 뛰어갑니다.")
    }
}

fun main() {
    Cat.name = "mikey"
    Cat.printName() // Cat의 이름은 mikey 입니다.

    // companion object 안의 코드 사용하기
    Dog.name = "Linda"
    Dog.printName() // Dog 이름은 Linda 입니다.
    //Dog.walk() companion object 밖에 선언된 메소드는 사용하지 못함

    // companion object 밖의 코드 사용하기
    val dog = Dog()
    dog.walk() // Dog가 뛰어갑니다.

}

 


2.  데이터 클래스

👩🏻‍💻  코틀린은 간단한 값의 저장 용도로 데이터 클래스 data class를 제공

data class 클래스 이름 (val 파라미터1: 타입, var 파라미터2: 타입)


  ✏️  데이터 클래스를 정의할 때 class 앞에 data 키워드를 사용해야 하고, 생성자 파라미터 앞에 입력하는 var 또는 val 키워드를 생략할 수 없음
  ✏️  생성하는 코드는 일반 클래스와 동일하게 작성

fun main() {
    // 정의 - 주로 코드 블록(클래스 스코프)을 사용하지 않고 간단하게 작성.
    data class UserData(val name: String, var age: Int)

    // 생성 - 일반 class의 생성자 함수를 호출하는 것과 동일
    val userData = UserData("Michael", 21)

    //userData.name = "Cindy" // val로 선언되었기 때문에 변경 불가능

    userData.age = 19 // var로 선언되었기 때문에 변경 가능
}

1) toString() 메소드와 copy() 메소드


  👾  일반 클래스에서 toString() 메소드를 호출하면 인스턴스의 주소값을 반환하지만, 데이터 클래스는 값을 반환하기 때문에 실제 값을 모니터링 할 때 좋음

    println("userData는 ${userData}") // userData는 UserData(name=Michael, age=19)
    println(userData.toString()) // UserData(name=Michael, age=19)

 

  👾  copy() 메소드로 간단하게 값을 복사할 수 있음

    var newData: UserData = userData.copy()

 

  👾  이처럼 클래스와 사용법이 동일하지만 주로 네트워크를 통해 데이터를 주고 받거나, 혹은 로컬 앱의 데이터베이스에서 데이터를 다루기 위한 용도로 사용

 

데이터 클래스는 toString(), copy()와 같은 메소드를 자동으로 만들어줌
    * toString() : 객체에 포함되어 있는 데이터를 출력하여 볼 수 있음. 생성자에 포함된 프로퍼티만 출력.
    * copy() : 객체의 속성들을 복사하여 반환하는 메소드이며 인수로 받은 프로퍼티만 해당 값으로 바뀌어 복사해줌
fun main() {

    data class Memo(val title: String, val content: String, var isDone: Boolean)
    val memo1 = Memo("마트 가기", "계란, 우유, 빵", false)

    val memo2 = memo1.copy(content="칫솔, 과자") // content 프로퍼티만 변경
    println(memo1.toString()) // Memo(title=마트 가기, content=계란, 우유, 빵, isDone=false)
    println(memo2.toString()) // Memo(title=마트 가기, content=칫솔, 과자, isDone=false)

}

 

 


3.  클래스의 상속과 확장

1) 클래스의 상속

 

👩🏻‍💻  상속을 사용하면 부모 클래스의 프로퍼티를 마치 내 클래스의 일부처럼 사용할 수 있음

      상속을 사용하는 예를 들면 안드로이드는 Activity라는 클래스가 미리 만들어져 있고, 이 Activity 클래스 내부에는 글자를 쓰는 기능, 그림을 그리는 기능, 화면에 새로운 창을 보여주는 기능이 미리 정의되어 있음. 상속이 있기에 이런 기능을 직접 구현하지 않고 Activity 클래스를 상속받아 약간의 코드만 추가하면 앱에 필요한 기능을 추가할 수 있음.

 

👩🏻‍💻  코틀린에서 클래스를 상속받으려면 부모 클래스에 open 키워드를 추가해야 함

       ✓ 상속을 받을 자식 클래스에서는 콜론을 이용해서 상속할 부모 클래스를 지정 .다음에 괄호를 입력해서 꼭 부모의 생성자를 호출

    open class 상속될 부모 클래스 {
        // 코드
    }

    class 자식 클래스 : 부모 클래스() {
        // 코드
    }


👩🏻‍💻  메소드도 자식 클래스에서 오버라이딩하려면 부모 클래스의 메소드에 open 키워드를 추가

fun main() {

    open class Flower {
        open fun waterFlower() {
            println("water flower")
        }
    }
    // 콜론 : 을 이용해 상속을 나타내면 됨
    class Rose: Flower() {
        override fun waterFlower() {
            super.waterFlower()
            println("Rose is water flower")
        }
    }

    val rose = Rose() // 객체 생성
    rose.waterFlower() // Rose is water flower

}

 



A. 생성자가 있는 클래스의 상속


👩🏻‍💻  상속될 부모 클래스의 생성자에 파라미터가 있다면 자식 클래스를 통해 값을 전달할 수 있음

   open class 상속될 부모 클래스(value : String) {
        // 코드
    }

    class 자식 클래스(value : String) : 부모 클래스(value) {
        // 코드
    }


   👾 부모 클래스에 세컨더리 생성자가 있다면, 자식 클래스의 세컨더리 생성자에서 super 키워드로 부모 클래스에 전달할 수 있음
   👾 부모 클래스의 세컨더리 생성자를 이용하는 경우에는 부모 클래스명 다음에 오는 괄호를 생략

 


B. 부모 클래스의 프로퍼티와 메서드 사용하기


👩🏻‍💻  부모 클래스에서 정의된 프로퍼티와 메서드는 내 것처럼 사용할 수 있음

    open class Parent {
        var hello: String = "안녕하세요"
        fun sayHello() {
            println(hello)
        }
    }

    class Child: Parent() {
        fun myHello() {
            hello = "Hello"
            sayHello()
        }
    }

    val child = Child()
    child.myHello() // Hello

2) 익스텐션


코틀린은 클래스, 메서드, 프로퍼티에 대해 익스텐션 extensions 을 지원
이미 만들어져 있는 클래스에 다음과 같은 형태로 추가할 수 있음

    fun 클래스.확장할 메서드() {    // 코드    }*

 

    👾  상속이 미리 만들어져 있는 클래스를 가져다 쓰는 개념이라면 익스텐션은 미리 만들어져 있는 클래스에 메서드를 넣는 개념
           ✓ 자신이 만든 클래스에 사용하기 보다는 이미 컴파일되어 있는 클래스에 메서드를 추가하기 위한 용도로 사용
    👾  실제 클래스의 코드가 변경되는 것은 아니며 단지 실행 시에 점 연산자로 호출해서 사용할 수 있도록 해줌

아래 코드는 기본 클래스인 String에 plus 메서드를 확장하는 코드
test 함수에 선언한 original에 문자열을 입력했기 때문에 original은 String의 익스텐션 메서드인 plus를 호출해서 사용
fun main() {

    fun String.addText(word: String) : String {
        return this + word
    }

    fun testStringExtension() {
        val original = "Hello"
        val added = "Guys~"

        println("added를 더한 값은 ${original.addText(added)}입니다.")
    }

    testStringExtension() // added를 더한 값은 HelloGuys~입니다.

}

 

 

[ 내용 참고 : IT 학원 강의 ]


1.  클래스  Class

간단하게 보면 클래스는 변수와 함수의 모음. 그룹화할 수 있는 변수와 함수를 한 군데에 모아 놓고 사용하기 쉽게 이름을 붙여놓은 것을 클래스 라고 이해하면 된다.


1) 코틀린에서 사용되는 클래스의 기본 구조

    class 클래스 이름 {
       var 변수
       fun 함수() {
           코드
       }
   }


 2) 클래스 코드 작성하기


👻  클래스를 만들기 위해서는 먼저 클래스의 이름을 정하고, 이름 앞에 class 키워드를 붙여서 만들 수 있음
👻  클래스 이름 다음에는 클래스의 범위를 지정하는 중괄호({}) 가 있어야 함
        ➡️  이 중괄호를 스코프 Scope라고 하는데, 클래스에서 사용했기 때문에 클래스 스코프라고 함

 class 클래스 이름 {  // 클래스 스코프 class scope   }


    ✓  '몇몇 예외'는 있지만 대부분의 코드는 클래스 스코프 안에 작성.

 

👻  작성된 클래스를 사용하기 위해서는 생성자라고 불리는 함수가 호출되어야 함

👻  코틀린은 프라이머리 primary와 세컨더리 Secondary 2개의 생성자를 제공


2. 생성자

1) 프라이머리 생성자

 class Person 프라이머리 생성자() { }


함수에 있는 코드를 실행하려면 함수를 호출해야 함. 클래스도 마찬가지로 클래스를 사용한다는 것은 곧 클래스라는 이름으로 묶여 있는 코드를 실행하는 것이기 때문에 함수 형태로 제공되는 생성자를 호출해야지만 클래스가 실행

  ⚡️ 프라이머리 Primary 생성자는 마치 클래스의 헤더처럼 사용할 수 있으며, constructor 키워드를 사용해서 정의하는데 조건에 따라 생략할 수 있음
  ⚡️ 프라이머리 생성자도 결국 함수이기 때문에 파라미터를 사용할 수 있음

   class Person constructor(value: String) {    // 코드   }

 

  📍 생성자에 접근 제한자나 다른 옵션이 없다면 constructor 키워드를 생략할 수 있음

  class Person(value: String) {   // 코드   }

 
   📍 클래스의 생성자가 호출되면 init 블록의 코드가 실행되고, init 블록에서는 생성자를 통해 넘어온 파라미터에 접근할 수 있음

fun main() {
    class Person1 constructor (str: String) {
        init {
            println("생성자로부터 전달받은 값은 ${str}입니다.")
        }
    }
    var person1 = Person1("1") // 생성자로부터 전달받은 값은 1입니다.
}

 

  📍   init 초기화 작업이 필요하지 않으면 init 블록을 작성하지 않아도 됨
          ➡️ 대신 파라미터로 전달된 값을 사용하기 위해서는 파라미터 앞에 변수 키워드인 val을 붙여주면 클래스 스코프 전체에서 해당 파라미터를 사용할 수 있음

fun main() {
    class Person2(val str: String) {
        fun process() {
            println("생성자로 생성된 변수의 값은 ${str}입니다.")
        }
    }

    var person2 = Person2("2")
    person2.process() // 생성자로 생성된 변수의 값은 2입니다.
}

    

   ✓ 생성자 파라미터 앞에 var도 사용할 수 있으나, 읽기 전용인 val을 사용하는 것을 권장


 2) 세컨더리 생성자


세컨더리 Secondary 생성자는 constructor 키워드를 마치 함수처럼 클래스 스코프 안에 직접 작성할 수 있음
그리고 다음과 같이 init 블럭을 작성하지 않고 constructor 다음에 괄호를 붙여서 코드를 작성할 수 있음

    class Person3 {
        constructor(str: String) {
            println("생성자로부터 전달받은 값은 ${str}입니다.")
        }
    }

 

  📍 세컨더리 생성자는 파라미터의 개수, 또는 파라미터의 타입이 다르면 (오버로딩) 여러 개를 중복해서 만들 수 있음

fun main() {
    class Sample {
        constructor(str: String) {
            println("생성자로부터 전달받은 값은 ${str}입니다.")
        }

        constructor(value: Int) {
            println("생성자로부터 전달받은 값은 ${value}입니다.")
        }

        constructor(value1: Int, value2: String) {
            println("생성자로부터 전달받은 값은 ${value1}, ${value2}입니다.")
        }
    }

    val sample = Sample(1,"2") // 생성자로부터 전달받은 값은 1, 2입니다.
}

3) Default 생성자


생성자를 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일

fun main() {
    class Student { // 생성자를 작성하지 않아도 기본 생성자가 동작.
        init {
            // 기본 생성자가 없더라도 초기화가 필요하면 여기에 코드를 작성.
        }
    }
}

 


 3.  클래스의 사용

클래스명()

 

👻  클래스의 이름에 괄호를 붙여서 클래스의 생성자를 호출. constructor 키워드를 호출하지 않음
    ⚡️ 아무런 파라미터 없이 클래스명에 괄호에 붙여주면 생성자가 호출되면서 init 블록 안의 코드가 자동으로 실행
    ⚡️ 세컨더리 생성자의 경우 init 블록이 먼저 실행되고 constructor 블록 안의 코드가 실행

👻  코틀린에서는 자바보다 클래스를 좀 더 편하게 정의할 수 있음
    ⚡️ 자바의 보일러 플레이트 코드가 삭제되고 필요한 코드들만 작성하면 되도록 바뀜
         * 보일러 플레이트 코드 : 상용구 코드. 변형이 거의 또는 전혀 없이 여러 위치에서 반복되는 코드 문구.

fun main() {
   
    class Car(val color: String)

    /*
    객체를 생성. 자바에서는 new 키워드를 사용했지만, 코틀린에서는 필요가 없음.
     */
    var car = Car("blue") // 객체 생성

}

 

 

 

[ 내용 참고 : IT 학원 강의 ]


1. 내장 객체  implicit object

👩🏻‍💻  JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미리 정의된 객체

👩🏻‍💻  JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함

👩🏻‍💻  JSP 페이지에 별도로 import 문 없이 자유롭게 사용할 수 있음

        ➡️ 스크립틀릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용

 

내장 객체의 종류
내장객체 반환유형 설명
request  javax.servlet.http.HttpServletRequest 웹 브라우저의 HTTP 요청 정보를 저장
response javax.servlet.http.HttpServletResponse 웹 브라우저의 HTTP요청에 대한 응답 정보 저장
out  javax.servlet.jsp.jsp.jspWriter JSP 페이지에 출력 할 내용을 담고 있는 출력스트림
session  javax.servlet.http.HttpSession 웹 브라우저의 정보를 유지하기 위한 세션 정보를 저장
application javax.servlet.ServletContext 웹 애플리케이션의 콘텍스트 정보를 저장
pageContext  javax.servlet.jsp.PageContext JSP 페이지의 정보를 저장
page 
java.lang.Object JSP 페이지를 구현한 자바 클래스로 JSP 페이지 자체를 나타냄
config javax.servlet.ServletConfig JSP 페이지의 설정 정보를 저장
exception
java.lang.Throwable JSP 페이지의 예외 발생을 처리

 

  ⚡️  내장 객체는 서블릿 프로그램에서 모두 _jspService() 메소드 내부에 있음

  ⚡️  메소드 매개변수인 request, reponse를 비롯해 pageContext, session, application, config, out, page 등은 메소드 내에 서 참조할 수 있는 참조 변수 

  ⚡️ 모든 내장 객체는 JSP 컨테이너가 관리하는 객체로, 이 중 request, session, application, pageContext를 이용하여 속성을 관리 할 수 있음

  ⚡️  속성은 각각의 내장 객체가 존재하는 동안 JSP 페이지 사이에서 정보를 주고받거나 공유하는데 사용

 

메소드 반환 유형 설명
setAttribute(String name, Object value) void 해당 내장객체의 속성 이름이 name인 속성 값을 value로 저장
getAttribute(String name) Object 해당 내장객체의 속성 이름이name인 속성 값을 반환
removeAttribute(String name) void 해당 내장객체의 속성 이름이 name인 속성을 삭제
getAttributeNames() java.util.Enumeration 해당 내장객체의 모든 속성 이름을 가져옴

 


1)  request 내장 객체의 기능과 사용법 

 

출처 : https://download.oracle.com/

 

request 내장 객체는 JSP 페이지에서 가장 많이 사용되는 기본 내장 객체로, 웹 브라우저에서 서버의 JSP 페이지로 전달하는 정보를 저장. 즉 폼 페이지로부터 입력된 데이터를 전달하는 요청 파라미터 값을 JSP 페이지로 가져옴. 

 

JSP 컨테이너는 웹 브라우저에서 서버로 전달되는 정보를 처리하기 위해 javax.servlet.http.HttpServletRequest 객체 타입의 request 내장 객체를 사용하여 사용자의 요구 사항을 얻어냄

 

요청 파라미터 관련 메소드 

 

  📍  요청 파라미터는 사용자가 폼 페이지에 데이터를 입력한 후 서버에 전송할 때 전달되는 폼 페이지의 입력된 정보 형태.

  📍  이러한 요청 파라미터는 <name=value> 형식으로 웹 브라우저에서 서버의 JSP 페이지로 전송

  📍  요청 파라미터는 폼 페이지에서 <input type="text" ...> 처럼 입력 양식이 텍스트 유형인 경우 값을 입력하지 않으면 서버로 빈 문자열이 전송. 하지만 체크 박스와 라디오 버튼 유형인 경우 선택하지 않고 전송하면 요청 파라미터 자체가 전달되지 않음.

 

메소드 반환 유형 설명
getParameter(String name) String 요청 파라미터 이름이 name인 값을 전달
요청 파라미터 값이 없으면 null을 반환
getParameterValues(String name) String[] 모든 요청 파라미터 이름이 name인 값을 배열 형태로 전달
요청 파라미터 값이 없으면 null을 반환
getParameterNames() java.util.Enumeration 모든 요청 파라미터의 이름과 값을 Enumeration 객체 타입으로 전달
getParameterMap() java.util.Map 모든 요청 파라미터의 이름과 값을 Map 객체타입으로 전달
Map 객체 타입은(요청 파라미터 이름,값) 형식으로 구성

 


요청 HTTP 헤더 관련 메소드 

 

  📍 웹 브라우저는 HTTP 헤더에 부가적인 정보를 담아 서버로 전송. request 내장 객체는 헤더 정보나 쿠키 관련 정보를 얻을 수 있는 메소드를 제공

메소드 반환 유형 설명
getHeader(String name) String 설정한 name의 헤더 값을 가져옴
getHeaders(String name) Enumeration 설정한 name의 헤더 목록 값을 가져옴
getHeaderNames() Enumeration 모든 헤더이름을 가져옴
getIntHeader(String name) int 설정한 name의 헤더 값을 정수로 가져옴
getDateHeader(String name) long 설정한 name의 헤더 값을 시간 값으로 가져옴
getCookies() javax.servlet.http.Cookie 모든 쿠키값을 가져옴

 

request 내장 객체로 모든 HTTP 헤더 정보 값 출력하기 

 

   1) 모든 헤더 이름을 가져오도록 request 내장 객체의 getHeaderNames() 메서드를 호출하고,

       이를 모두 저장하도록 Enumeration 객체 타입의 변수 en을 작성.

   2) Enumeration 객체 타입 변수 en의 hasMoreElements() 메서드를 통해 저장된 헤더 이름이 있을 때까지

       반복하도록 while문 작성.   

  3) 현재 헤더 이름을 가져오도록 Enumeration 객체 타입 변수 en의 nextElement() 메서드를 작성.

  4) 설정된 헤더 이름의 값을 가져오도록 request 내장 객체의 getHeader() 메소드를 작성.

        예) user-agent : 사용자의 브라우저 정보.

              referer : 현재페이지로 이동해오기 바로 전 페이지의 주소.

<body>
    <%
      Enumeration<String> en = request.getHeaderNames();
      while (en.hasMoreElements()) {
        String headerName = (String) en.nextElement();
        String headerValue = request.getHeader(headerName);
    %>
    <%=headerName%> : <%=headerValue%><br>
    <%
      }
    %>
</body>

웹 브라우저/서버 관련 메소드 

 

  📍 request 내장 객체는 웹 브라우저의 요청 및 서버 관련 정보를 얻을 수 있는 메소드를 제공

 

메소드 반환유형 설명
getRemoteAddr() String 웹브라우저의 IP 주소를 가져옴
getContentLength( ) long 웹 브라우저의 요청 파라미터 길이를 가져옴
getCharacterEncoding()  String 웹 브라우저의 문자 인코딩을 가져옴
getContentType()  String 웹 브라우저의 콘텐츠 유형을 가져옴
getProtocol() String 웹 브라우저의 요청 프로토콜 을 가져옴
getMethod() String 웹 브라우저의 HTTP 요청 메소드(GET, POST)를 가져 옴
getRequestURI() String 웹 브라우저가 요청한 URI 경로를 가져옴
getContextPath()  String 현재 JSP 페이지의 웹 애플리케이션 콘텍스트 경로를 가져 옴
getServerName()  String 서버 이름을 가져옴
getServerPort() int 실행 중인 서버 포트 번호를 가져옴
getQueryString()
String 웹 브라우저의 전체 요청 파라 미터 문자열[물음표(?) 다음 URL에 할당된 문자열]을 가져 옴

 

request 내장 객체로 모든 웹 브라우저 및 서버 정보 값 출력하기
<body>

    <%-- 웹 브라우저의 IP 주소 반환 --%>
    <p>클라이언트 IP : <%=request.getRemoteAddr()%>
        
    <%-- 웹 브라우저의 요청 정보 길이 반환 --%>
    <p>요청 정보 길이 : <%=request.getContentLength() %>

    <%-- 웹 브라우저의 요청 정보 인코딩 반환 --%>
    <p>요청 정보 인코딩 : <%=request.getCharacterEncoding() %>

    <%-- 웹 브라우저의 요청 정보 콘텐츠 유형 반환 --%>
    <p>요청 정보 콘텐트 유형 : <%=request.getContentType() %>

    <%-- 웹 브라우저의 요청 정보 프로토콜 반환 --%>
    <p>요청 정보 프로토콜 : <%=request.getProtocol() %>

    <%-- 웹 브라우저의 요청 정보 방식 (GET, POST)을 반환 --%>
    <p>요청 정보 전송방식 : <%=request.getMethod() %>

    <%-- 웹 브라우저에 요청한 URI 경로를 반환 --%>
    <p>요청 URI : <%=request.getRequestURI() %>

    <%-- 현재 JSP 페이지의 웹 애플리케이션 콘텍스트 경로를 반환 --%>
    <p>컨텍스트 경로 : <%=request.getContextPath() %>

    <%-- 서버 이름을 반환 --%>
    <p>서버 이름  : <%=request.getServerName() %>

    <%-- 실행 중인 서버 포트 반환 --%>
    <p>서버 포트  : <%=request.getServerPort() %>

    <%-- 웹 브라우저의 전체 요청 파라미터 문자열(쿼리문) 반환 --%>
    <p>쿼리문  : <%=request.getQueryString() %>

</body>

request 내장 객체로 폼 페이지에서 아이디와 비밀번호를 전송받아 출력하기

 

    1) 폼 페이지에서 입력한 한글을 처리하도록 request 내장 객체의 setCharacterEncoding() 메서드에

        문자 인코딩 유형을 utf-8로 작성 

    2) 입력된 아이디와 비밀번호를 폼 문으로부터 전송받도록 request 내장 객체의 getParameter() 메서드를 작성

<body>
    <form action="request01_process.jsp" method="post">
          <p> 아 이 디 : <input type="text" name="id">
          <p> 비밀번호 : <input type="password" name="passwd">
          <p> <input type="submit" value="전송" />
    </form>
</body>
// request01_process.jsp 파일
<body>

    <%
      request.setCharacterEncoding("utf-8");
      String userid = request.getParameter("id");
      String password = request.getParameter("passwd");
    %>
    <p> 아이디 : <%=userid%>
    <p> 비밀번호 : <%=password%>

</body>

 

 

 

[ 내용 참고 : IT 학원 강의 ]


1.  include 디렉티브 태그

👻  현재 JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
       ➡️  포함할 수 있는 외부 파일은 HTML, JSP, 텍스트 파일 등
👻  include 디렉티브 태그는 서블릿 프로그램으로 번역될 때 현재 JSP 페이지와 설정된 다른 외부 파일의내용이 병합되어 번역
👻  머리글과 바닥글 같은 공통된 부분을 별도의 JSP 파일로 만들어 웹 페이지를 모듈화 할 수 있다.
       ➡️ 코드를 재사용하고 중복된 코드를 줄임으로써 유지 보수 측면에서 매우 유용

 

 include 디렉티브 태그를 사용하는 이유


외부파일의 내용(예: header, footer)을 복사하여 현재 JSP 페이지에 붙여넣을 수 있지만 이는 좋은 방법이 아니다.
예를 들어 머리글과 바닥글에 해당하는 외부 파일 2개와 100개의 JSP페이지가 있는 경우 JSP 페이지 100개에 외부 파일 2개의 내용을 복사하여 붙여넣었을 때 이 외부 파일의 내용을 변경해야 한다면JSP 페이지 100개를 모두 수정 편집해야 한다.


하지만 include 디렉티브 태그를 사용하면 모든 외부 파일을 포함하므로 외부 파일의 내용을 변경할 때마다 특정 외부 파일만 수정 편집하면 된다.

예를 들어 하나의 프로젝트에서 다수의 JSP 페이지가 동일한 설정을 사용할 경우에 모든 페이지에 다 코딩을 할 수 있고 하나의 페이지에 설정 코드를 넣고 인클루드 해서 사용할 수 있다. 모든 페이지에 동일한 코드를 넣는 경우 특정 페이지의 오타 or 설정을 변경해야 하는 경우작업이 번거로워 진다. 하나의 페이지에 설정 코드를 넣고 인클루드 해서 사용하면 오타에 자유롭고 + 설정을 변경해야 하는 경우에 간편하다.

 

<body>
    <%@ include file="_header.jsp"%>
    <p>방문해 주셔서 감사합니다.</p>
    <%@ include file="_footer.jsp"%>
</body>
// _header.jsp 파일
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h4>헤더 페이지 영역입니다.</h4>
// _footer.jsp 파일
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<footer>Copyright .JSP</footer>

 


2. taglib 디렉티브 태그

👻  현재 JSP 페이지에 표현 언어, JSTL, 사용자 정의 태그 custom tag 등 태그 라이브러리를 설정하는 태그

<%@ taglib uri="경로" prefix="태그 식별자" %>


  ⚡️  uri 속성은 사용자가 정의한 태그의 설정 정보를 가진 경로 주소
  ⚡️  prefix 속성은 uri에 설정한, 사용자가 정의한 태그를 식별하기 의한 고유 이름
         ▶️ 해당 JSP 페이지 내에서 uri속성 값을 그대로 사용하면 복잡하므로 prefix 속성 값이 대신 식별할 수 있게 해주는 것

 

👻  taglib 디렉티브 태그가 서블릿 프로그램으로 번역될 때 uri 속성 값은 JSP컨테이너에 사용자가 정의한 태그 라이브러리의 위
치를 알려줌. prefix 속성 값은 사용자가 정의한 태그 라이브러리의 접두어 태그가 무엇인지 JSP 컨테이너에 알려주는 역할.

 

JSTL 태그 

 

유용한 JSP 태그의 모음인 JSTL은 자주 사용되는 핵심 기능을 제공. 반복문, 조건문과 같은 논리적 구조 작업, XML 문서 조작, 국제화 태그 조직, SQL 조작 수행을 위한 태그를 지원. JTSL을 사용하려면 WebContent/WEB-INF/lib 디렉터리의 위치에 jstl.jar 라이브러리 파일이 있어야 함. Apache Standard Taglib 페이지에서 다운로드 가능.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--taglib 디렉티브 태그에 태그 라이브러리로 JSTL을 설정하는 예--%>
    <c:forEach var="k" begin="1" end="10" step="1">
        <c:out value="${k}"/>
    </c:forEach>
</body>
</html>

 

[ 내용 참고 : IT 학원 강의 ]


1.  디렉티브 태그  Directive Tag

디렉티브 태그는 JSP 페이지를 어떻게 처리할 것인지를 설정하는 태그

 

JSP 페이지가 서블릿 프로그램에서 서블릿 클래스로 변환할 때 JSP 페이지와 관련된 정보를 JSP 컨테이너에 지시하는 메시지. 따라서 디렉티브 태그는 JSP 페이지를 수정하여 다시 컴파일하는 경우에만 역할을 수행하기 때문에 개별 HTML 응답에 특별한 영향을 미치지 않음

 

태그 형식 설명
page <%@ page ... %> JSP 페이지에 대한 정보를 설정
include <%@ include ... %> JSP 페이지의 특정 영역에 다른 문서를 포함
taglib <%@ taglib ... %> JSP 페이지에서 사용할 태그 라이브러리를 설정

 

 

1)  page 디렉티브 태그 

 

🚀  JSP 페이지가 생성할 콘텐츠 유형의 문서, 사용할 자바 클래스, 오류 페이지 설정, 세션 사용 여부, 출력 버퍼의 존재 유무 등과 같이 JSP 컨테이너가 JSP 페이지를 실행하는데 필요한 정보를 설정 

🚀  일반적으로 JSP 페이지의 최상단에 선언하는 것을 권장

🚀  <@ 사이에는 공백을 주지 말것 

 

page 디렉티브 태그의 속성
속성 설명 기본값
language  현재 JSP 페이지에서 사용할 프로그래밍 언어를 설정 java
contentType  현재JSP 페이지의 콘텐츠유형을 설정 text/html
pageEncoding  현재 JSP 페이지의 문자 인코딩 유형을 설정   ISO-8859-1
import 현재 JSP 페이지에서 사용할 자바 클래스를 설정  
session  현재 JSP 페이지의 HTTP 세션 사용 여부를 설정 true
buffer 현재 JSP 페이지의 출력 버퍼를 설정 8KB
autoFlush 자동으로 출력 버퍼를 비우는 것을 제어하는데 사용 true
isThreadSafe  현재 JSP 페이지에서 멀티스레드의 동작을 제어하는 데 사 true
info  현재 JSP 페이 지에 대한 설명 을 설정  
errorPage  현재 JSP 페이 지가 실행되는 동안 오류가 발 생하면 특정 오류 페이지로 이동하는 데 사용   
isErrorPage 현재 JSP 페이지가 오류 페이지인지 여부를 설정  
isELIgnored  현재 JSP 페이지의 표현 언어 Expression
Language 사용 여부를 설정
false
isScripting 스크립트 태그 (선언문, 스크립틀릿, 표현문) 사용 여부를 설정  

 

  📍  하나의 page 디렉티브 태그에 하나 또는 여러 개의 속성을 설정 또는 여러 개의 속성마다 개별적으로 page 디렉티브 태그를 선언할 수 있음. import 속성을 제외한 속성은 JSP 페이지에 한 번씩만 설정할 수 있음

 

 

A. language 속성 

<%@ page language="java" %> 

 

  👾  현재 JSP 페이지에서 사용할 프로그래밍 언어를 설정하는 데 사용, 생략 가능 


B. contentType 속성 

<%@ page contentType="text/html :charset=utf-8" %> 

 

  👾  현재 JSP 페이지의 콘텐츠 유형을 설정하는 데 사용 

  👾  text/html, text/xml, text/plain 등이 있고 기본 값은 text/html.

  👾  문자열 세트 charset 를 설정하여 JSP 페이지의 전체 문자열을 변경할 수 있음 

application/msword 로 설정
<%@ page contentType="application/msword" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
    page 디렉티브 태그에 콘텐츠 유형을 마이크로 소프트 워드 문서(application/msword)로 설정하기.
    1) 콘텐츠 유형을 application/msword로 설정하도록 page 디렉티브 태그의 contentType 속성을 작성.
    --%>
    Today is: <%=new java.util.Date()%>
</body>
</html>

 

text/xml 로 설정
<%@ page contentType="text/xml;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>contentType 디렉티브 태그</h2>
    <h4>text/html : HTML 출력</h4>
    <h4>charset=utf-8 : 문자 인코딩</h4>
</body>
</html>


C. pageEncoding 속성 

<%@ pageEncoding="ISO-8859-1" %>
<%@ page contentType="text/html :charset=ISO-8859-1" %> 

 

  👾  현재 JSP 페이지의 문자 인코딩 유형을 설정하는 데 사용

  👾  문자 인코딩 유형의 기본값은 ISO-8859-1


D. import 속성 

<%@ page import="java.io.*, java.lang.*" %> 
<%@ page import="java.io.*" %> 
<%@ page import="java.lang.*" %> 

 

  👾  현재 JSP 페이지에서 사용할 자바 클래스를 설정하는 데 사용.

  👾  둘 이상의 자바 클래스를 포함하는 경우 쉼표(,)로 구분하여 연속해서 여러 개의 자바 클래스를 설정할 수 있음


E. session 속성 

<%@ page session="true" %> 

 

  👾  현재 JSP 페이지의 HTTP 세션 사용 여부를 설정하는 데 사용. 기본 값은 true. 

  👾  session 속성 값이 true이면 현재 JSP 페이지에서 내장 객체인 session 변수를 사용할 수 있음.


F. buffer 속성 

<%@ page buffer="none" %> 
<%@ page buffer="32KB" %>

 

  👾  현재 JSP 페이지의 출력 버퍼를 설정하는 데 사용

  👾  이 속성 값은 none과 '버퍼 크기'로 설정할 수 있음

     ⚡️ 속성 값을 none으로 설정하면 출력 버퍼를 채우지 않고 웹 브라우저로 직접 보냄

     ⚡️ '버퍼 크기'로 속성 값을 설정하면 출력 버퍼에 먼저 기록을 한 후 웹 브라우저로 전송

 

출력버퍼를 사용하는 이유 

 

  1) 작은 데이터를 여러 번 전송하는 것 보다 한번 큰 데이터를 전송함

        ▶️  큰 단위를 한번에 전송하는 것이 전송성능에 있어서 더 효율적

  2) 응답결과가 바로 전송되지 않기 때문에 JSP실행 도중 출력버퍼를 지우고 새로운 내용을 보여줄 수 있다. 

        ▶️ JSP가 응답 결과를 생성하는 도중 에러가 발생했을 시 출력버퍼를 비우고 에퍼레이지를 출력할 수 있도록 할 수 있다. 

  3) 버퍼가 다 차기 전까지는 헤더를 변경할 수 있다

       ▶️ 출력버퍼가 flush 되거나 꽉차서 자동으로 출력되기 이전까지는 얼마든지 헤더를 변경할 수 있다


 

G. autoFlush 속성 

<%@ page autoFlush="true" %>

 

  👾  자동으로 출력 버퍼를 비우는 것을 제어하는데 사용. 기본값은 true. 

  👾  출력 버퍼가 채워진 경우 자동으로 버퍼에 있는 데이터를 웹 브라우저로 보내고 버퍼를 비울지 또는 버퍼 오버플로의 예외를 나타낼지 등의 처리를 설정

  👾  false로 설정하면 출력 버퍼가 가득 채워질 때 버퍼 오버플로의 예외를 발생. 


H. isThreadSafe 속성 

<%@ page isThreadSafe="true" %> 

 

  👾  현재 JSP 페이지에서 멀티스레드의 동작을 제어하는 데 사용. 기본 값은 true. 

  👾  여러 요청이 동시에 수신되는 경우 JSP 페이지가 어떻게 동작해야 하는지를 JSP 컨테이너에 지시하여 응답할 수 있게 함. 

  👾 속성 값이 true이면 JSP 페이지에 대해 수신된 여러 요청이 동시에 처리되고 

                       false로 설정하면 요청이 순차적으로 처리


I. info 속성 

<%@ page info="Home Page JSP" %> 

 

  👾  현재 JSP 페이지에 대한 설명을 설정하는 데 사용. 주석과 같은 기능. 

 


J. errorPage 속성 

<%@ page errorPage="MyErrorPage.jsp" %> 

 

  👾  현재 JSP 페이지가 실행되는 동안 오류가 발생하면 특정 오류 페이지로 이동하는 데 사용.

  👾  웹 서버가 제공하는 기본 오류 페이지를 사용하지 않고 이동할 오류 페이지의 URL을 설정.


K. isErrorPage 속성 

<%@ page isErrorPage="true" %> 

 

  👾  현재 JSP 페이지가 오류 페이지인지 여부를 설정하는 데 사용

  👾  기본 값은 false이고 예외 처리를 위한 내장 객체인 exception 변수를 사용할 수 없음.

  👾 속성 값을 true로 설정하면 현재 JSP 페이지는 오류 페이지가 됨

  👾  만약 다른 JSP 페이지에서 오류가 발생하면, 호출되는 오류 페이지는 true가 설정된 JSP 페이지가 됨. 

 


L. isELIgnored 속성 

<%@ page isELIgnored="true" %>

 

  👾  재 JSP 페이지의 표현 언어 Expression Language 사용 여부를 설정

  👾  기본 값은 false이며 JSP 페이지에 표현 언어의 표현식 '${}'을 사용할 수 있음

  👾  true로 설정하면 JSP 페이지에 사용된 표현 언어의 표현식을 처리할 수 없기 때문에 정적 텍스트로 처리

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="true"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    request.setAttribute("RequestAttribute", "request 내장 객체");
%>
${requestScope.RequestAttribute} <%-- 표현문처럼 특정값을 추출 --%>
<script>
    const str = '문자열';
    alert(`${str} 입니다.`);
</script>

</body>
</html>

true일 때

 

false 일 때


M. isScriptingEnabled 속성 

<%@ page isScriptingEnabled="false" %> 

 

  👾  스크립트 태그 (선언문, 스크립틀릿, 표현문) 사용 여부를 설정하는데 사용

  👾  속성 값이 true로 설정하면 기본 스크립트 태그를 사용할 수 있고,

        false로 설정하면 스크립트 태그를 제한하기 때문에 스크립트 태그를 사용하는 경우 번역시 오류가 발생

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

 


1.  자바 백엔드의 발전

 

1)  서블릿 : 자바로 html 표현하는 것 (자바와 html 결합) 처음엔 자바코드에서 html을 출력

     📍 단점: html 작업이 힘들다

출처 :&nbsp;https://medium.com/javarevisited/servlet-things-every-java-developer-must-know-servlet-container-filter-and-listener-374a460169bd

 

2)  JSP : PHP의 영향으로 html 코드에 자바가 들어감. 서블릿과 반대

     📍 단점: 규모가 큰 프로젝트에서는 구조화된 작업이 힘들다. → 유지보수 어려움

출처 :&nbsp;https://mauryaravi021.medium.com/servlet-and-jsp-3a830470689b

 

3)  JSP + 서블릿을 이용한 MVC 패턴 : controller와 model은 servlet으로, view는 jsp로 작업

     📍 단점 : 구조화된 프로그래밍은 가능한데, 규모가 더 커지니 코드가 복잡하고 성능 저하

 

💡 자바 서블릿 (Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 서블릿은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.

 

4)  스프링 : servelet 코드 없이 순수 자바 코드만으로 작업 가능. 경량화

     📍 단점 : 버전이 올라가면서 성능 저하. 설정 잡기가 힘듦

 

5)  스프링 부트 : 적은 코드 줄 수로 서비스가 가능. MSA에 적합

     ➡️  최신 신규 프로젝트는 대부분 스프링 부트로 작업

 

  • 클라이언트 측 실행언어 : 브라우저에서 실행되는 언어. 자바스크립트
  • 서버 측 실행 언어 : 서버에서 실행되는 언어. JSP, PHP, ASP, 파이썬, node.js

2.  스크립트 태그  Script Tag

태그 형식 설명
선언문 declaration <!% ... %> 자바 변수나 메소드를 작성
스크립틀릿 scriptlet
<% ... %> 자바 로직 코드 작성
표현문 expression <%= ... %> 선언문의 변수, 메소드, 계산식을 호출하여 문자열로 출력

 

 

1) 선언문 태그 declaration 

<%! 자바 코드; %> 

 

🚀  변수나 메소드 등을 선언하는 태그 

🚀  선언문 태그에 선언된 변수와 메서드는 서블릿 프로그램으로 번역될 때 _jspService() 메소드 외부에 배치되므로 JSP 페이지 임의의 위치에서 선언할 수 있음

🚀  스크립틀릿 태그보다 나중에 선언해도 스크립틀릿 태그에서 사용할 수 있음

🚀  선언문 태그로 선언된 변수는 서블릿 프로그램으로 번역될 때 클래스 수준의 멤버 변수가 되므로 전역 변수로 사용

 

변수 선언
<body>
    <%--선언문 태그 사용 예 : 전역변수 선언--%>
    <%!
      int count = 0; // 전역변수 count를 0으로 초기화
    %>
    Page Count is
    <%
      out.println(++count); // 전역변수 1 증가. 새로 고침을 하면 숫자가 증가.
    %>
</body>


메소드 선언
<body>
    <%-- 선언문 태그에 전역 메서드 사용하기 --%>
    <%-- 전역 메서드 sum()을 선언하기 위해 선언문 태그를 작성 --%>
    <%!
      int sum(int a, int b) {
        return a + b;
      }
    %>
    <%-- 결과 값 출력을 위해 스크립틀릿 태그를 작성 --%>
    <%
      out.println("2 + 3 = " + sum(2, 3)); // 선언문 태그에 선언된 전역 메서드 sum() 호출.
    %>
</body>


2) 스크립틀릿 태그 scriptlet 

 

<% 자바 코드; %> 

 

🚀  자바 코드로 이루어진 로직 부분을 표현

🚀  스크립틀릿 태그는 가장 일반적으로 사용되며 변수 또는 메소드 호출, 유효식 등을 포함할 수 있음

🚀  모든 텍스트, HTML 태그, 또는 JSP 요소는 스크립틀릿 태그 외부에 있어야 함

🚀  스크립틀릿 태그에 작성된 자바 코드는 서블릿 프로그램으로 변환될 때 _jspService() 메소드 내부에 복사

      ➡️ 각 클라이언트의 요청에 대해_jspService() 메소드가 호출되므로 이 메소드의 내부 코드가 클라이언트의 요청마다 실행

      ➡️  _jspService() 메소드 내부에 복사되므로 지역변수가 되어 이 태그에 선언된 변수는 스크립틀릿 태그 내에서만 사용

 

지역 변수 선언
<body>
    <%
      int count = 0; // 지역 변수 선언
    %>
    Page Count is
    <%
      out.println(++count); // 지역 변수 1 증가.
    %>

</body>

 

  📍  전역 변수와 달리 지역변수에서는 1만 증가 ▶️ 새로고침해도 증가되지 않음

 


3) 표현문  expression

<body>
    <%-- 표현문 태그로 현재 날짜 출력하기 --%>
    <p> Today's date: <%=new java.util.Date()%></p>
</body>


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>Stripting Tag</h2>

    <%!
        // 선언문 태그를 사용하여 자바 변수와 메서드 정의.
        int count = 3;
        String makeItLower(String data) {
            return data.toLowerCase(); // 소문자로 변경하는 코드
        }
    %>
    <%
        // 스크립틀릿 태그로 자바 로직 코드 작성
        for (int i = 1; i <= count; i++) {
            out.println("Java Server Page " + i + ".<br>");
        }
    %>
    <%-- 표현문 태그로 선언문의 메서드를 호출하여 문자열 형태로 출력 --%>
    <%=makeItLower("Hello World")%>
</body>
</html>

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts