본문 바로가기

KOSTA : 클라우드 네이티브 애플리케이션 개발 전문가 양성과정

06/12 41일차 Java Test / Spring

728x90

# 전날 Summarize

boot는 17만 허용합니다. 

MVC 프로젝트 생성

메서드마다 맵핑을 시킴

tomcat-->web.xml

톰캣마다 여러 프로젝트를 등록할 수 있습니다. 프로젝트마다 공통으로 해야될 것은 톰캣 web.xml에서 수행하고(한글 처리), 개별 프로젝트 설정은 프로젝트 web.xml에서 설정합니다. 공통부분이 있으면 공통부분을 따르고, 오버라이딩된 부분이 있다면 프로젝트 설정에 따릅니다.

4 이하 버전에서는 어노테이션을 사용할 수 없습니다. xml에서 서블릿과 요청값을 맵핑합니다.

 

디스패쳐 서블릿은 @Controller부터 찾습니다.

로그포맷 가능한 이유 --> 리소스

컨트롤에게 받아야되는이름 jsp 이름

 

 

# Java Test

 

1. 다음 중 배열 선언 및 초기화가 잘못된 것은?  

a. int[] arr;

b. int[] arr = {1,2,3,};

c. int[] arr = new int[5];

d. int[] arr = new int[5]{1,2,3,4,5};

e. int arr[5];

f. int[] arr[] = new int[3][];

 

- 배열 초기화할때 크기와 초기값을 같이 사용할 수 없습니다.

- 배열 선언에서 크기를 초기화할 수 없습니다.

 

4. 다음 코드의 실행 결과는? error

public class CallTest{

 public static void main(String[] sar){

   System.out.println(true+null);

  }

}

- 피연산자의 자료형이 잘못되었습니다.

- true는 논리 자료형값, null은 객체 참조가 없는 값입니다. 보통 참조형 변수에 사용됩니다.

 

5. 다음 코드의 실행결과는? nullABtrue

public class CallTest{

static String str;

public static void main(String[] args){

   System.out.println(str+'A'+'B'+true);

  }

}

- str은 문자열이고 나머지는 문자와 논리값으로 문자열 결합이 일어납니다.

- 문자열 결합의 결과는 nullABtrue 입니다

 

12. 코드의 실행 결과는?

class Shape{
	public void draw(){
    	System.out.println("모양을 그립니다");
    }
}
class Circle extends Shape{
	public void draw(){
    	System.out.println("원을 그립니다");
    }
}
public class ClassTest{
	public static void main(String[] args){
    	Shape s = new Circle();
        Circle c = new Circle();
        s.draw(); //--1
        c.draw(); //--2
    }
}

 

1 : 원을 그립니다

2 : 원을 그립니다

- shape 형태의 변수 s는 객체 circle을 참조합니다. 참조 변수의 타입이 아닌 실제 객체의 타입에 따라 메서드가 호출됩니다.

- circle 형태의 변수 c는 객체 Circle을 참조합니다. 호출 시 Circle 클래스의 draw()이 호출됩니다.

 

15. 다음 코드의 실행 결과는?

package com.kosta.lec;

public class ExceptionTest{
	static void test() throws RuntimeException{
    	try{
        	System.out.print("test");
            throw new RuntimeException();
        }catch (Exception ex){
        	System.out.print("exception");
        }
    }
    
    public static void main(String[] args){
    	try{
        	test();
        } catch(RuntimeException ex){
        	System.out.print("runtime");
        }
        System.out.print("end");
    }
}

test

exception

end

- main()에서 클래스메서드 test()가 실행됩니다. 

- test() 메서드에 test가 출력되고, 예외가 생기게 됩니다. test() 메서드안에 catch문이 실행되어 exception이 실행됩니다.

- catch문은 한번 잡으면 끝이기 때문에 메서드 이후 catch문을 실행되지 않고, end가 실행되게 됩니다

 

17. 다음은 상속(구현)의 관계이다. 빈칸에 들어갈 키워드는?

a. 상위: 추상 class / 하위: class

b. 상위: class / 하위: interface

c. 상위: interface / 하위: class

d. 상위: interface / 하위: interface

 

상속 관계 키워드

a. extends

b. 불가능

c. implements

d. extends 

 

18. 다음 코드의 실행 결과는?

package com.java;
public class Parent{
	int x = 100;
    int y = 'A';
}

package com.test;
import com.java.Parent
public class Child{
	public static void main(String[] args){
    	Parent p = new Parent();
        System.out.print();
    }
}

 

#Apach와 톰캣 무슨 연관이 있지??

APACHE란

아파치 소프트웨어 재단에서 만든 웹서버 프로그램입니다. 그렇다면 웹서버는 무엇인가?

웹서버

하드웨어 : 웹 서버 소프트웨어와 웹 사이트의 구성 요소 파일을 저장하는 컴퓨터를 의미한다.

소프트웨어: HTTP 서버를 의미한다. HTTP 서버는 저장하는 웹 사이트의 도메인 이름을 통해 액세스 할 수 있으며 이러한 호스팅 된 웹 사이트의 콘텐츠를 최종 사용자의 장치로 전달합니다. 요청이 올바른 웹서버(하드웨어)에 도달하면 HTTP서버(소프트웨어)가 요청을 수락하고 요청된 문서를 찾은 다음에  HTTP를 통해 브라우저로 다시 보냅니다.

결국

아파치 서버란 클라이언트에서 요청하는 HTTP요청을 처리하는 웹서버를 의미합니다. 정적 타입만을 처리합니다.

 

톰캣(Tomcat)이란 (컨테이너, 웹 컨테이너, 서블릿 컨테이너로도 불림)

JAVA EE 기반으로 만들어졌으며, JSP와 Servlet을 구동하기 위한 서블릿 컨테이너 역할을 수행합니다.

DB연결, 다른 응용프로그램과 상호 작용 등 동적인 기능들을 사용할 수 있습니다.

 

컨테이너(Container)

동적인 데이터들을 가공하여 정적인 파일로 만들어주는 모듈입니다.

 

서블릿 

클라이언트의 요청을 받고 요청을 처리하여 결과를 클라이언트에게 제공하는 자바 인터페이스

 

서블릿 컨테이너

서블릿들을 모아 관리 

새로운 요청이 들어올 때마다 새로운 스레드를 생성

작업이 끝난 서블릿 스레드 자동 제거

 

WAS

DB처리, 로직처리를 요구하는 동적타입을 제공하는 소프트웨어 프레임워크를 말합니다.

프로그램 실행환경과 데이터베이스 접속기능을 제공합니다.

여러개의 트랜잭션을 관리합니다.

업무를 처리하는 비즈니스 로직을 수행합니다.

 

 

 

 

 

# 서블릿 컨테이너와 스프링 컨테이너

 

##서블릿과 서블릿 컨테이너 동작방식

1.웹 브라우저에서 요청이 들어왔을때

- 해당 url 정보를 분석하여 요청을 처리할 web.xml에 등록된 서블릿을 찾습니다.

- 서블릿에 대한 스레드를 생성하고 HttpServletRequest, HttpServletResponse객체를 생성한 뒤 서블릿을 service() 메서드로 호출합니다.

- 해당 서블릿은 생성된 스레드안에서 동작합니다.

2.요청을 처리할 Servlet 인스턴스 생성과 처리

- Servlet 객체는 service() 메서드가 호출되고 요청에 따라 doGet(), doPost()등의 메서드가 호출됩니다.

- Servlet 컨테이너에서 제공하는 HttpServletRequest, HttpServletResponse 객체를 사용하여 HTTP 요청 및 응답을 처리합니다.

- 이후 처리된 정보를 HttpServletResponse 객체에 설정해주고 HTTP 응답정보를 반환합니다.

- Servlet 컨테이너는 HttpResponse 형태로 전환한 뒤 웹서버에게 전달합니다.

- 서블릿이 동작했던 쓰레드를 종료하고, HttpServletRequest, HttpServletResponse 객체를 소멸시킵니다.

3.서블릿의 소멸시기

- 웹 어플리케이션이 종료되면 destroy() 메서드를 통하여 서블릿 객체를 제거합니다.

- destroy() 메서드는 Servlet 객체가 사용한 자원을 해체하는 작업을 담당하며 이후. Servlet 객체는 GC에의해 메모리에서 제거됩니다.

 

 

##Spring Container

위 서블릿 컨테이너는 서블릿을 초기화할때

Spring Container는 각각의 서블릿이 제대로 동작하기 위해 필요한 의존성 주입(DI)을 제공합니다.

Spring Container의 역할은 빈(bean) 객체들을 생성하고, 빈 객체들간의 의존성을 관리하며 빈 객체들이 필요한 곳에 서 주입(Injection)해주는 등의 역할을 맡습니다.

빈 객체를 생성하고 생명주기를 관리할 때 스프링 컨테이너가 직접 관리하기 때문에 Inversion Of Control(IOC)라고 불리며 객체 생성, 관리, 의존성 관련 코드들이 아닌 서비스에 대한 코드만 집중할 수 있습니다.

 

 ##IOC와 DI

DI는 IoC를 구현하는 방법중 하나입니다. IoC가 제어의 역전 개념을 통틀어 말하는거라면, DI는 이 개념을 구현하기 위해 의존 관계를 외부에서 주입하는 방식입니다.

 

간단한 예시로는 

//예시1
public class Aclass{
	private Bclass b = new Bclass();
}

 

// 예시2

public class Aclass{
	private Bclass b;
    
    public Aclass(Bclass b){
    	this.b = b;
    }
}

 

예시 1과 예시 2 모두 A클래스는 B클래스의 의존성을 가지고 있습니다. 그래서 B가 변경되면 A도 변경됩니다.

하지만 예시 2는 외부에서 생성자를 통해 B를 주입받습니다. 

이러한 생성자를 활용한 DI말고도, Setter주입, 인터페이스 주입등이 있습니다.

스프링에서는 이 방식을 활용하여 이 의존관계가 빈으로 등록되어 있다면

자동으로 @ Autowired와 같은 어노테이션 하나로 의존성을 주입해주기 때문에 결합도는 낮추고, 확장성 높은  코드를 작성할 수 있습니다.

 

##Spring Container의 종류

BeanFactory, ApplicationContext 크게 2가지로 나눌수 있다.