그럼 Servlet이란? 

자바엔터프라이즈 에디션에서 제공하는 웹을 만들 수 있게 제공하는것이다.

요청당 쓰레드를 사용한다.

 

지금은 직접 사용하진않지만 Spring의 기초뼈대이다.

 

서블릿은 단독으로 실행할 수 없고 서블릿 컨테이너가 실행해야한다.

 

서블릿 스펙을 준수하는 컨테이너(톰캣)가 서블릿의 라이플사이클을 이용해 실행한다.

 

라이플사이클

서블릿컨테이너가 서블릿 인스턴스의 init메소드를 호출하여 초기화한다.

 

서블릿 컨테이너가 구동될때 서블릿 리스너가 DB에 연결하고 여러가지 서블릿에 제공할 수 있다.

서블릿컨텍스트에서 꺼내서 사용한다.

 

서블릿 컨테이너가 종료할때 서블릿 리스너를 이용해 DB커넥션을 반납한다.

 

 

Java servlet API은 런타임때 빠진다. 컨테이너가 가지고있다.

 

Servlet 예제

public class HelloServlet extends HttpServlet {

    //원시적인 ServletApplication
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        ApplicationContext applicationContext = (ApplicationContext) getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

        HelloService helloService = applicationContext.getBean(HelloService.class);
        resp.getWriter().println("Hello "+ helloService.getName());
    }

    private Object getName() {
        return getServletContext().getAttribute("name");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

 

서블릿에서 사용하는 두가지 기능

 

서블릿리스너

servletlistener

public class MyListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
        //서블릿보다 윗개념이기에 서블릿에서 꺼내서 사용할 수 있다.
        sce.getServletContext().setAttribute("name","사용");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}

-서블릿 컨테이너보다 윗개념

-서블릿컨테이너에서 발생하는 이벤트에 특정한 코드를 실행할때 사용한다.

-종료될때도 사용할 수 있다.

-(DB연결등 여러가지)

 

서블릿필터

servletfilter

public class MyFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter");
        //체인형식으로 다음필터에게 전달해주어야한다.
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("My Filter init");
    }

    public void destroy() {
        System.out.println("My Filter destroy");
    }
}

-필터를 거쳐 서블릿에간다

-요청이 들어왔을때 서블릿으로 가기전에 전처리할때 사용한다.

-여러개의 서블리셍 추가적인 작업을 하거나 특정한 URL에 적용할 수 있다.

-체인 구조로 순차적으로 실행된다.

  • 생산성 향상을 위해선 IDE를 잘 활용해야한다.

    ToolBox

    JetBrains 홈페이지 접속
    Tool Box App을 다운받아서 여러 IDE 설치를 권장한다.

    Intellij IDEA Ultimate 는 유료지만 자바스크립트,스프링,서블릿을 사용할 수 있다.

    프로젝트 생성하기

    GroupID : 프로젝트 그룹을 이야기한다.(스프링)
    ArtifactID : 프로젝트 그룹의 하위 모듈(스프링 시큐리티,MVC)

    메인메소드 생성하고 실행하기

    파일생성 : command + n ,Alt+insert
    메인메소드 : psvm
    System.out.println() : sout
    실행환경 실행 현재 : 맥 Ctrl + Shift + R 윈도우 Ctrl + Shift + f10
    실행환경 실행 이전 : 맥 Ctrl + R  윈도우 Shift + f10

    라인수정하기

    1.라인 복제하기 

맥 command +d 윈도우 Ctrl + d


2.라인 삭제하기 

맥 command +d 윈도우 Ctrl + y


3.문자열 라인 합치기 

맥,윈도우 Ctrl + Shift + j


4.라인 단위 옮기기 
구문 (메소드 안) 

맥 command + shift + 방향키 윈도우 ctrl + shift + 방향키
라인이동  

맥 Option + Shift + 방향키  윈도우 Shift + Alt + 방향키

 

5.Element 단위로 옮기기
구문 (메소드 안) 

맥 option + command + shift + 방향키 윈도우 alt + ctrl + shift + 방향키

코드 즉시보기

1.인자값 즉시 보기
맥 command + p 윈도우 ctrl + p


2.코드 구현부 즉시 보기(직접 안찾아 가도 됌)
맥 option + space 윈도우 Shift + Ctrl + i


3.Doc 즉시 보기
맥 F1 윈도우 ctrl +q

여러 서비스를 개발 할때 REST API란 이름으로 우리는 API를 만든다.

그러면서도 우린 아니 나는 REST API가 무엇인지 정확히 모르고 있었다.

그러던 차에 https://tv.naver.com/v/2292653

그런 REST API로 괜찮은가? 라는 영상을 보게되었다.

다들 시간이 날때 보면 좋을거 같다.


우선 REST란 말의 해석을 보면

Representational State Transfer 의 약자

이렇게 나온다.
몬지 모르겠다...


rest란말은 로이필딩(roy fielding)이란 사람이 여러사람과

http1.0을 정립하고 명세를 하게되었는데

http를 고치게되면 기존 웹과의 호환성의 문제가 생길 수 있었다.

웹을 망가트리지않고 http를 진보 시킬방법을 생각하다

Http Object Model이란 해결책을 만들게 되었다.


이 Http Object Model이 Rest 정의의 시작이다.


RestAPI

- 여러 아키텍쳐스타일의 집합(6가지)

동영상을 보면 다 나온다.

- 그중 uniform interface를 지키지 않는경우가 많다.


uniform interface란?

메세지는 스스로 설명해야한다.

- 목적지,명세를 표현해줘야한다.

- HETEOAS

전이가 될 수 있어야한다.

예를 들어 글 목록 -> 글 쓰기 -> 글 저장 -> 글 보기 -> 글 목록

링크를 타고 할 수 있게 되는 것이다.

- 명세

명세는 id,title란 정보가 있으면 그게 무엇인지 표현해주는것을 말한다.


uniform interface을 신경 써야하는 이유

- 서버와 클라이언트가 독립적으로 진화한다.

- 서버가 기능 변경이 되어도 클라이언트는 업데이트를 할 필요없다.

예를 들어 이전글,다음글을 보게 개발되어있을때 링크정보가 있다면

클라이언트는 변경할 것이 없다.


RestAPI로 안만들어도 될때는?

- 서버가 클라이언트를 통제가능할때 

혼자 다 개발하면 신경안써도된다.

- 진화에 관심 없을때

여러번의 업데이트등이 문제안될때


다음번 API개발할때는

RestAPI개념을 정확히 하여 개발해보자.

자바 Exception 핸들링

Exception

- 프로그램이 핸들링할 수 있는 경우를 Exception이라고 한다.

- 처리가 가능하다.

- checked exception(complie time)

+ 실행하기 이전 예측가능하다.

+ 파일 확인할때 에러,SQL관련

+ 이클립스,인텔리제이등 ide가 컴파일 할때 체크 해준다.

- unchecked exception(runtime)

+ 실행해야 알 수 있다.

+ 실행시 객체생성없는경우(NullPointer), Array싸이즈가 안맞는 에러등이 있다.

Error

- 핸들링이 불가능해 회복이 불가능하다. 대표적으로 OOM(메모리문제)가 있다.


Exception 핸들링 방법

try, catch block

- 블럭을 설정해 Exception을 처리해준다.

throws

- 메소드 선언부에서 사용한다.

- 메소드를 불러오는 메소드에 책임은 전가한다.

- Exception이 생기면 던져준다.

throw(인위적 Exception 발생)

- Exception이 필요한 상황에 개발자가 Exception을 발생시킨다.

- try, catch나 throws를 사용해야한다.

자바에서 static개념

- 객체지향프로그램인 자바는 객체,변수등이 필요할때 메모리에 올려야한다.

- static은 프로그램으로 객체생성이전 JVM에 클래스가 로딩될때 메모리에 올라온다.

- 변수,메소드,내부클래스에서 static을 사용가능하다.

- 변수,메소드에서 자주사용한다.

- 변수에 static이 붙게 되면 Class로 접근 가능하다.

- 전역변수가 필요할때 static을 사용한다.

- 메소드에 static이 붙게되면 Class로 접근가능하다.

- 대표적인예제 public static void main(String[] args)


abstract와 Interface의 차이

SuperClass와 subClass로 구성된건 같다.

서브클래스는 슈퍼클래스의 큰 영향을 받는다.


abstactClass

- 슈퍼클래스가 어느정도 구현되어있고 나머지를 서브클래스에서 구현해야할때사용한다.

- single inheritance이다.(다중상속불가능)

- 모든 접근제한자에서 가능하다.

- 일반적인 변수,상수가 사용가능하다.

- abstractMethods,concreteMethods 둘다 가능하다.


Interface

- 실질적인 구현이없는 abstractMethods만있는 빈깡통클래스

- 일종의 규약을 위해 생성한다.

- 상속이아닌 구현으로 다중구현이 가능하다.

- public만 가능하다.

- 오직 상수만이 가능하다.

- abstractMethods만가능하다.

오버라이딩

overriding

- 부모 클래스로 부터 상속받은 메소드를 자식클래스에서 다시구현한다.

- 자식클래스에서 입맛에 맞게 다시 구현

- 메소드에 파라미터,리턴타입은 부모,자식클래스이 같아야한다.

- 자식클래스에서 필요해의해 다양하게 수정하기 위해서이다.


오버로딩

overloading

- 같은 클래스안에서 이름이 같은 메소드를 말한다.

  - 이름은 같은 메소드지만 다양한 파라미터를 받아서 처리할때 사용한다.

- 파라미터가 달라야한다.

- 리턴타입은 같지않아도 된다.

String 생성 방법의 차이

1. String s1 = new String("Java");

2. String s2 = "Java"; <-리터럴방식

1번 방식으로 생성하게 되면 힙메모리에 올라가게된다.

2번 방식으로 생성하게되면 자바1.7이후 힙메모리안 StringPool이라는 특정메모리안에 올라가게된다.

2번 방식은 값이 같을 경우 같은 주소를 보게된다.


즉, == 로 비교하게되면 주소값을 비교하게되는데 2번방식으로 생성할때만 비교할 수 있다.

.equals()방식은 문자열을 비교하는 것이기 때문에 모두 가능하다.


즉, new()로 생성하면 힙메모리에 생성되고 ""로 생성하게되면 힙메모리안 StringPool에 생성되어 재사용가능하다.



String,StringBuffer,StringBuilder의 차이


String은 불가변적이다.

StringBuffer,StringBuilder은 가변적이다.


String 객체는 Heap메모리에 생성되면 변하지않는다.

변경하게되면 새로운 객체를 생성해야한다.

ex)

String s = "a";

s = s + "b";


String 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

String s = "a";

s(reference값)은 Heap 메모리의 "a"의 주소값을 보고 있다.


s = s + "b"; 를 하게되면 

s(reference값)가 보고있는 "a"값에 "b"를 추가하는것이아닌

"ab"라는 객체를 다시만들고 그 객체의 reference값으로 바꾼다.


ex)StringBuffer ,StringBuilder 동일하다.

StringBuffer s = new StringBuffer("a");

s.append("b");


StringBuilder,StringBuffer 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

차이점은 StringBuilder,StringBuffer는 객체를 새로 생성하지않고

기존 객체에 값을 추가한다.


개발시에 문자열 병합이 빈번하게 일어나면 StringBuilder,StringBuffer를 사용하는게 좋다.


StringBuilder,StringBuffer 차이는?


synchronization(동기화)지원여부의 차이다.


synchronization란?

하나에 제한되어있는 데이터를 여러 스레드가 공유가 사용할때

데이터가 깨지지않게 줄을세워 키를 가지고 있는 데이터를 처리하고 나머지데이터는 대기시킨다.

데이터무결성을 보장할 수 있다.


StringBuffer는 동기화를 지원하고

StringBuilder는 동기화를 지원하지 않는다.


멀티스레드를 사용하지 않는다면 

StringBuffer보단 StringBuilder가 빠르다.


자바 메모리영역 Stack,Heap


Stack

- Stack 메모리는 비교적 가벼운데이터들을 말한다.

- primativeData,reference(주소값)이 있다.


Heap

- Heap 메모리는 객체등 무거운데이터가 머물러있다.

- Garbage Collection은 Heap메모리에서 작동한다.


ex)

마트에 갔을때 가벼운 물건들은 바로바로 구매하지만

배송이 필요한 물건은 reference를 보고 구매하면

Heap에서 가져오게 된다.

autoboxing,unboxing이란?


autoboxing,unboxing의 개념은 jdk 1.5 부터 나왔다.


자바에는 크게 2가지 데이터 타입이 있다.

primitive Data,Object Data 두가지!


primitive Data

- boolean, char, byte, short, int, long, float, double

- 아주 가벼운 데이터를 말한다.

- 스택메모리에 머물러있다.


Object Data

- 상대적으로 무거운 데이터이다.

- 실제 데이터는 힙메모리에 공유하고 레퍼런스만 스택메모리에 있다.


Wrapper Class

- primitive Data를 ObjectData화 시킨 Class이다.


jdk 1.5 이전에 서로 호환할려면 개발자가 명시적으로 바꿔줬어야했다.

하지만 jdk 1.5가 나오면서 직접호환이 가능하게 되었다.


primitive Data 에서 Wrapper Class로 자동으로 변환되는걸 autoboxing이라 한다.

가벼운 데이터를 무거운데이터에 넣기에 autoboxing이라고 생각하면 간단하다.


Wrapper Class에서 primitive Data 자동으로 변환되는걸 unboxing이라 한다.

무거운 데이터를 가벼운데이터에 넣기에 unboxing이라고 생각하면 간단하다.


autoboxing이란?

- 컴파일러가 primitive Data를 Object Data로 자동변환하는것이다.

- int a = 42; Integer b =a;

- 과거엔 객체를 생성했어야했다.


unboxing이란?

- 컴파일러가 Object Data를 primitiveData로 자동변환하는것이다.

- Integer a = new Integer(42); int b =a;

- 과거엔 a.intValue();로 생성했어야했다.


+ Recent posts