JAVA 기술 면접 준비

null·2022년 12월 13일
0

JAVA_Bitcamp

목록 보기
10/10

스프링 구조

  • DispatcherServlet
    : HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)
    : 요청이 오면 실제로 로직을 수행할 컴포넌트로 요청을 보내주고, 반환을 받는 역할

  • HandlerMapping
    : 스프링 프레임워크에 작성된 여러 Controller 중에서 로직을 수행할 Controller 찾아주는 역할

  • Controller
    : 해당 Controller(@RequestMapping("/url"))을 찾아 해당 Controller의 해당 메서드를 인식하고 찾아 요청

  • Service
    : 비지니스 로직을 수행

  • DAO (Data Access Object)
    : Database에 직접적으로 접근하는 객체

  • ViewResolver
    : ViewName을 기반으로 어떤 View 파일을 사용 할 것인지 확인

  • View
    : UI 화면 의미


스프링 부트

  • 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립실행형 애플리케이션을 복잡한 고민 없이 빠르게 작성할 수 있게 도와주는 여러가지 도구의 모음

Spring MVC

  • Spring MVC는 Spring에서 제공하는 웹 모듈로 model, view, controller
    세가지 구성 요소를 사용하여 사용자의 요청을 처리하고 응답할수 있도록하는 프레임워크

Model

  • Model: Map<String, Value> 형태의 데이터 저장
  • Map 자료 구조로, HTTP Request 속의 데이터를 파싱해 Key-Value 쌍으로 만들어 저장

REST API : Representational State Transfer(REST)

  • REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나
  • REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처이다
  • (http) put : 클라이언트는 PUT을 사용하여 서버의 기존 리소스를 업데이트

Spring MVC 패턴 흐름

웹 브라우저의 요청이 들어오면
DispatcherServlet(Front Controller) ->
HandlerMapping으로 Controller 검색을 요청하고 ->
해당Controller(@RequestMapping("/url"))을 찾아 해당Controller의 해당메서드를 인식하고 찾아 ->
Controller -> Service -> DAO -> DB -> DAO -> Service -> Controller 의 순서로 진행 클라이언트의 요청을 처리하고 결과를 출력할 view와 뷰에 전달할 객체를 담고 있는 Model 객체를 리턴 ->
ViewResolver는 컨트롤러에서 보내온 view(.html)를 클라이언트에게 리턴하여 화면 출력

  1. 스프링부트가 로드될때 리소스 경로에있는 application.properties 를 읽어온다

  2. 실행이되면서 @어노테이션들을 컨테이너에 집어넣는다 => 그 시점부터는 스프링부트 ioc컨테이너에서 관리가 시작된다

  3. 로컬호스트(아이피)8080 서버에 요청이 이루어지고( / 인덱스가 생략된 상태)

    server

    server.port=8080
    server.servlet.context-path=/

  4. 서버 정보를 읽고 디비 정보를 읽고 연결 설정 => 이러한 것들이 로드된 시점에 진행이 되어있는 상태고

  5. url 요청이 들어오면 컨트롤러를 찾게된다

  6. 페이지를 던져준다 : 리턴 (스프링에서 알아서 찾아줌)

  7. import org.springframework.ui.Model;
    => 모델에 담아서 model.addAttribute();
    => 클라이언트단으로 던져준다


IoC (Inversion of Controll) 역제어

  • 일반적인 경우 : 객체가 필요하면 생성해서 쓴다
  • 역제어의 경우 : 필요한 객체를 외부에서 만들어서 주입해준다 => 객체 교체 용이 (Dependency Injection)

DI (Dependency Injection) 의존성 주입

  • 외부에서 두 객체 간의 관계를 결정해 주는 디자인 패턴

  • 인터페이스를 사이에 두어 클래스 레벨에서 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 결합도를 낮춘다
    (의존성: 한 객체가 다른 객체를 사용할 때)

  • 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다

    Product product = new Pencil();
    Store store = new Store(product); // injection

    객체들 간에 관계가 맺어졌다면 다른 객체의 구체 클래스(Pencil인지 Food 인지 등)를 전혀 알지 못하더라도,
    (해당 클래스가 인터페이스를 구현했다면) 인터페이스의 타입(Product)으로 사용할 수 있다


AOP (Aspect Oriented Programming) 관점 지향 프로그래밍

  • 시스템을 핵심과 공통으로 나눈다

  • 공통사항들을 별도의 클래스에서 정의한다

  • 공통사항들을 별도의 모듈로 설계 구현하여 생산성과 유지보수성을 향상 시키는 것이 목적

  • 스프링에서 제공하는 스프링 AOP는 프락시 기반의 AOP 구현체이다

  • 프록시 객체를 사용하는 것은 접근 제어 및 부가 기능을 추가하기 위해서이다

  • 스프링 AOP는 스프링 Bean에만 적용할 수 있다

  • 스프링 AOP는 순수 자바로 구현되었기 때문에 특별한 컴파일 과정이 필요하지 않다

Proxy 패턴

  • 프록시 패턴에서는 interface가 존재하고 Client는 이 interface 타입으로 Proxy 객체를 사용
  • Proxy 객체는 기존의 타겟 객체(Real Subject)를 참조
  • Proxy 객체와 기존의 타겟 객체의 타입은 같고, Proxy는 원래 할 일을 가지고 있는 Real Subject를 감싸서
    Client의 요청을 처리

POJO(Plain Old Java Object)

  • 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

@Bean

  • Bean : Spring에 의하여 생성되고 관리되는 자바 객체
  • @Component Annotation이 등록되어 있는 경우에는 Spring이 Annotation을 확인하고 자체적으로 Bean 으로 등록
    => @Controller Annotation을 Ctrl 을 눌러서 이동해보면 @Controller Annotation에는
    @Component Annotation이 있는 것을 확인할 수 있다
    -> @Component Annotation 으로 인하여 Spring은 해당 Controller를 Bean 으로 등록합니다.

@Component
: 이 애노테이션을 붙이면 spring IoC컨테이너가 객체를 자동 생성
: 생성자의 파라미터 값을 자동으로 주입
: 파라미터에 해당하는 객체가 없다면 생성 오류 발생

  • 클래스를 역할에 따라 좀 더 섬세하게 제어하기 위해 만든 애노테이션

  • @Controller

  • @Repository : DAO 역할을 수행하는 객체에 붙인다

  • @Service : 비지니스 로직 / 데이터 가공 / 트랜잭션을 제어하는 클래스에 붙인다

  • @RequestParam
    : GET 요청 파라미터 전송 방식, HTML Form 전송 방식을 사용할 때에 조회할 수 있는 방법
    : @RequestParam("파라미터 이름") 자료형 변수명

  • @RequestBody / @ResponseBody
    : 클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때, Java에서는 해당 JSON 형식의 데이터를
    받기 위해서 JSON -> Java Object로의 변환이 필요
    : 마찬가지로 요청된 데이터를 처리 후, 서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java
    Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요
    => 이러한 과정을 해당 어노테이션들이 처리

    - @RequestBody 
     : HttpRequest의 본문 requestBody의 내용을 자바 객체로 매핑하는 역할
     : DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는
       MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달
    	 : 일반적인 GET 메서드의 요청 경우에는 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라, 
    	   URI 또는 URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션을 통해 해당 요청 내용을 받을 수가 없다 
     -> GET 메서드의 경우 @PathVariable, @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 합니다.
    	 : 반면에 xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다

    : HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다

    - @Responsebody 
     : return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달
     : @RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로 
       HttpResponse의 본문 responseBody에 자바 객체가 매핑되어 전달

Servlet

  • 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

  • 웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션

  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다

  • Java Thread를 이용하여 동작

  • 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송

  • 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성

  • web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다

  • 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출

  • doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다

  • 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다

Dispatcher-Servlet

  • HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)

filter 와 interceptor 차이

filter

  • java.servlet 제공
    요청 - filter - Dispatcher-Servlet - (handlerMapping) - controller

interceptor

  • Spring에서 관리하며 Dispatcher-Servlet에서 요청이 이루어짐과 동시에 같이 호출되어
    인증, 권한 등 동작을 추가 할수 있다
    요청 - Dispatcher-Servlet - interceptor - controller

java

  • 객체지향 프로그래밍 언어
  • 자바 가상 머신위에서 동작하기 때문에 운영체제에 독립적
  • 가비지컬렉터를 통한 자동적인 메모리 관리가 가능
  • 다중 상속이 불가능하며, 타입에 제약이 많다

JVM : 자바 가상 머신

  • java byte code를 각 OS에 맞게 가상 기계어로 변환해주는 역할
  • 가비지컬렉터를 통한 자동적인 메모리 관리가 가능

OOP (object oriented progrmming)

  • 기계적인 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때도 객체들을 조립해서 작성할 수 있도록 하는 기법

  • 프로그램을 절차(Procedure) 및 데이터로 함께 묶은 객체들의 집합으로 구성

  • 추상화 / 캡슐화 / 다형성 / 상속

  • 다형성 : 하나의 코드를 여러 용도로 쓰이게 하는 것
    - 오버로딩 : 매개변수의 타입이나 개수가 다르더라도 같은 기능을 하는 메서드의에 대해 같은 이름을 갖게하는 것
    - 오버라이딩: 상위 클래스에서 상속 받은 메서드를 서브 클래스 형식에 맞게 재정의 하는 것


BO, VO, DTO, DAO 설명

DAO(Data Access Object)

  • DataBase 접근을 하기 위한 로직과 비지니스 로직을 분리하기 위해 사용

DTO(Data Transfer Object)

  • 데이터 저장 담당 클래스
  • Controller, Service, View 등 계층간 데이터 교환을 위해 사용되는 객체
  • 로직을 갖지 않는 순수한 데이터 객체이며 getter, setter 메소드만을 포함

VO(Value Object)

  • 데이터 저장 담당 클래스
  • DTO와 혼용해서 쓰이지만, VO는 값(Value)을 위해 쓰이는 객체로 불변(read only)의 속성을 가진다
  • 보통 getter의 기능만을 포함

BO(Business Object)

  • 비즈니스 로직을 포함하는 오브젝트

클래스

  • 객체를 만들어 내기 위한 설계도
  • 연관되어 있는 변수와 메서드의 집합

객체

  • 클래스에 선언된 모양 그대로 생성된 실체
  • 클래스의 인스턴스라고 부른다

인스턴스

  • 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체

예를들어 붕어빵을 만든다고 상황을 가정해보자.
여기서 클래스는 붕어빵을 만들기 위한 틀이 되고 객체는 붕어빵이다.
그리고 인스턴스는 붕어빵 틀로 찍어낸 각각의 붕어빵이다.

팥붕어빵과 슈크림붕어빵은 같은 타입의 객체이지만, 인스턴스 관점으로 보았을 때는 다르다.


제네릭

  • 컴파일시 타입을 체크해 주는 기능
  • 객체 타입 안정성을 높이고 형 변환의 번거로움을 줄일 수 있다
  • 제네릭 클래스를 작성 할 때 object 타입 대신 타입 변수 를 선언해서 사용

추상클래스와 인터페이스 차이

공통점

  • new 연산자로 객체 생성 불가
  • 하위 클래스에서 모든 메서드를 구현해야한다

차이점

  • 추상클래스 abstract class
  • 인터페이스 implements 다중 상속 가능
    : Service 객체는 고객사의 업무방식에 따라 약간씩 다를 수 있다(예/ 첨부파일 저장이 필요한 곳과 아닌곳)
    : Controller가 Service객체를 클래스이름으로 사용하게 되면 Service 객체를 교체 할때 마다 Controller 코드를
    변경해야 한다 => 유지 보수 어려움
    : 해결책_ Controller가 직접 class 이름을 언급하지 말고 인터페이스 규칙에 따라 사용하도록 변경

프로세스

  • 프로세스는 메모리 상에서 실행중인 프로그램
  • 프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받는다
    (Code, Data, Stack, Heap)
  • 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다
    => 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다

스레드 (경량 프로세스)

  • 스레드는 프로세스 내에서 실행되는 흐름 단위
  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유
  • 각각의 스레드는 별도의 레지스터(PC)와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다

멀티 스레드

  • 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것
  • 멀티 스레드의 자원 공유는 전역 변수를 이용하므로 동기화 문제가 발생 할 수 있다
  • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다

트랜잭션


java 3대 컬렉션

  • List 인터페이스
    : LinkedList, Stack, Vector, ArrayList
    : 순서 O, 데이터 중복 허용 O

  • Set 인터페이스
    : HashSet
    : 순서 X, 데이터 중복 허용 X

  • Map 인터페이스
    : Hashtable, HashMap
    : 순서 X, key 중복 허용 X, Value 중복 허용 O


Reflection

  • 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

  • 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다

  • Class<?> classInfo = class.forName("cname"); // 클래스를 알아낸다

  • Constructor<?> c = classInfo.getConstructor(); // 생성자를 알아낸다

  • c.newInstance(); // 생성자를 통해 인스턴스 생성


get / post 방식 차이점

get : 받은 데 이터를 주로 뿌려주고 싶을 때 사용

  • header에 데이터를 붙여 전송 : QueryString 형태로 데이터를 URL에 포함
  • 길이 제한이 있다 : 브라우저마다 지원하는 길이가 다름
  • 웹 브라우저는 URL을 캐시에 저장 (보안 매우 취약)

post : insert / update 등 과같이 데이터의 변경이 일어날 때 사용

  • body에 데이터를 붙여 전송 : 보내는 데이터의 크기에 제약이 없어 binary데이터로 보낼수 있다
  • 웹 브라우저가 캐시하지 않는다 (보안 유리) : 파라미터가 노출되지 않는다

ajax : Asynchronous JavaScript and XML

  • 자바스크립트를 이용해서 비동기식으로 XML,json 등 을 이용하여 서버와 통신하는 방식
  • 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있다

$.ajax ({
url: "url" // 요청이 전송될 URL주소
type: "GET" // http 요청 방식 (default: get)
data: {key, value} // 요청 시 포함될 데이터
dataType: "json" // 응답 데이터 형식 (명시하지 않을 경우 자동으로 추측)

success: function(data, status, xhr) {
	// 정상적으로 응답 받았을 경우 success 콜백이 호출
	// 이 콜백 함수의 파라미터에서는 응답 바디, 응답 코드, 그리고 XHR 헤더를 확인 할 수 있다
}

error: function(xhr, status, error){
}

});

JSON (Java Script Object Notation)

  • 키와 값(key-value) 한쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 사용하는 개방형 표준 포맷
  • http통신 시 데이터를 주고받을 때 흔히 쓰이는 데이터 포맷 (josn, xml... ) 중 하나
  • 비동기식 통신(ajax)을 위해, 넓게는 xml을 대체하는 주요 데이터 포맷
  • 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다

세션과 쿠키 차이점

session

  • 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점까지 상태를 유지시키는 기술

  • 접속한 웹 브라우저의 서버에 저장 : 세션이 생길때마다 서버의 리소스를 차지

  • 세션 아이디는 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장되며 브라우저 종료시 소멸

  • 동작 순서
    -> 클라이언트가 페이지에 요청 (사용자가 웹사이트에 접근)
    -> 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여,
    클라이언트가 해당 session-id를 보냈는지 확인
    -> session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려준다
    -> 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장
    -> 클라이언트는 재접속 시, 이 쿠키를 이용해 session-id 값을 서버에 전달

cookie

  • 사용자가 어떠한 웹 사이트를 방문할 경우,그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장
    :서버의 자원을 사용하지 않음

  • HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용

  • 쿠키 만료 시점은 쿠키 저장시 설정 : cookie.setMaxAge(60 60 24 * 7);

  • 동작 순서
    -> 클라이언트가 페이지를 요청 (사용자가 웹사이트에 접근)
    -> 웹 서버는 쿠키를 생성
    -> 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다
    -> 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송
    -> 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송

  • 사용 예시

  • 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"

  • 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크

세션과 쿠키를 사용해야하는 이유

  • HTTP 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에,
    쿠키와 세션을 사용하지 않으면 로그인을했음에도, 페이지를 이동할때마다 계속 로그인을 해야하기 때문이다

프레임워크

  • 애플리케이션을 개발 하는데 있어 기본적으로 필요한 구조와 구성을 갖추고 있는 틀
  • 클래스와 라이브러리가 합쳐진 구조 -> 이미 구축되어있는 프레임워크를 사용하여 개발에만 집중할 수 있도록 해주는 틀

라이브러리

  • 단순 활용가능한 도구들의 집합
  • 개발을 하기 위해 필요한 것 들을 미리 구현해놓은 도구

프레임워크와 라이브러리의 차이 : 흐름을 누가 가지고 있느냐

  • 프레임워크 : 내가 작성한 코드를 제어하고 대신 실행하면 그것은 프레임워크이다
  • 라이브러리 : 사용자가 흐름을 직접 제어 -> 어디서, 언제 호출할지 사용자가 결정

JDBC (Java Database Connectivity)

  • 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 프로그래밍 인터페이스

executeUpdate()

  • insert, delete, update : 반환값의 타입 int

executeQuery()

  • select : 반환값의 타입 ResultSet
  • ResultSet : next()로 row(한 줄)로 불러옴

myBatis

  • 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 보다 쉽게 도와주는 프레임워크
  • SQL문이 코드로부터 완전히 분리
    • 기존에는 DAO 파일에 모든 SQL문을 작성하였지만 MyBatis에서는 Mapper 파일에 SQL코드를 입력해 놓고 DAO에서는 Mapper파일에 작성된 SQL 코드만 가져와 사용 할 수 있다 ( + 유지보수성 향상)

log4j : Log for Java

  • 로그문의 출력을 다양한 대상으로 할 수 있도록 도와주는 도구

SQL

  • inner join
    : 공통된 부분만 골라 결합 (교집합)

  • full outer join : 전체 테이블 결합 (합집합)
    :mySql에서는 지원하지 않기 때문에
    : left join union right join 를 합집합을 이용하여 출력

  • left (outer) join
    : 왼쪽 테이블 기준으로 일치하는 행만 결합되고 일치하지 않는 행은 null값으로 채워짐

  • right join
    : 오른쪽 테이블 기준으로 일치하는 행만 결합되고 일치하지 않는 행은 null값으로 채워짐

  • Cross join
    : 곱집합 (카디션 곱)

  • insert into 테이블명 ('컬럼'') values('값');

  • select *(컬럼) from 테이블명 (where 제약 조건);

  • delete from 테이블명 where 제약조건;

  • update 테이블 set 컬럼=값 where 제약조건;


0개의 댓글