티스토리 뷰

🔑 MVC 모델

1. MVC 모델 1과 MVC 모델 2의 차이점에 대해 설명하시오.

👉🏻 MVC 모델 정리 포스팅

👉🏻 MVC란 Model, View, Controller의 줄임말로써, MVC는 사용자와 상호작용하는 S/W를 디자인함에 있어 세가지 요소로 쪼개어 하는 것을 의미합니다.
 MVC 모델 1은 웹 브라우저의 요청을 JSP 페이지가 받아서 처리 하는 구조입니다. 
JSP 페이지 안에서 모든 정보를 표현(view)하고 저장(model)하고 처리(control)되므로 재사용이 힘들고, 읽기도 힘들어 가독성이 떨어집니다. 주로 중소형 프로젝트에 적합한 모델입니다.
 MVC 모델 2는 모델 1과 달리 웹 브라우저의 요청을 하나의 서블릿이 받게 됩니다. 서블릿은 웹 브라우저의 요청을 알맞게 처리한 뒤, 그 결과를 JSP로 포워딩 합니다. 처리 작업의 모듈화로 유지보수가 쉬워지는 반면 개발 시간이 늘어난다는 단점을 가지고 있습니다. 

(+) Spring MVC 모델 2

👉🏻 스프링 MVC 프레임워크는 스프링이 제공하는 트랜잭션 처리, DI, AOP를 손쉽게 사용할 수 있습니다.
다른 MVC 프레임워크와 마찬가지로 컨트롤러를 사용하여 요청을 처리합니다. 스프링에서는 DispatcherServlet이 MVC에서의 컨트롤러(Controller)부분을 처리합니다. 

 

💡 구성 요소

구성 요소 설명
DispatcherServlet

클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을
View에 전달하여 알맞은 응답을 생성한다.

HandlerMapping 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정한다.
Controller 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에 리턴한다.
ModelAndView 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.
ViewResolver 컨트롤러의 처리 결과를 생성할 뷰를 결정한다.
View 컨트롤러의 처리 결과 화면을 생성, JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용한다.

 

 

🔑 JAVA

2. Java 8의 변경사항에는 무엇이 있는지 설명하시오.

👉🏻 Java 8 버전에는 람다 표현식(Lamda expressions), 스트림 API(Stream API), java.time 패키지, 나즈혼(Nashorn)이 주목할만한 특징입니다.

 람다 표현식은 메소드를 하나의 식으로 표현한 것입니다. 식별자 없이 실행할 수 있는 함수 표현식을 의미하며, 따라서 익명 함수(Anonymous function)라고도 부릅니다. 

(+) 사용 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new Thread(new Runnable() {
 
    public void run() {
 
        System.out.println("전통적인 방식의 일회용 스레드 생성");
 
    }
 
}).start();
 
new Thread(()->{
 
    System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
 
}).start();
 
 



스트림 API는 저장된 데이터에 접근하는 경우 반복문이나 반복자를 사용하여 매번 코드를 작성하는 불편한 점이 있었는데 이러한 문제점을 보완하기 위해서 도입된 방법입니다.  데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공합니다. 따라서 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있습니다.

(+) 사용 예

//Before
List<Shape> list = new ArrayList<Shape>();
for(Shape s : shapes){
	if(s.getColor() == RED){
		list.add(s);
	}
}
//After
shapes.stream().filter(s -> s.getColor() == Red).collect(toList());

 


 java.time 패키지는 Calendar 클래스의 문제점을 보완하기 위해 도입되었습니다. Calendar 인스턴스는 불변객체가 아니라서 값이 수정될 수 있었고, 윤초와 같은 특별한 상황을 고려하지 않았으며 월(month)를 나타낼 때 1월부터 12월을 0~11까지로 표현해야 하는 불편함이 있었습니다. 

(+) 사용 예

LocalDate today = LocalDate.now();

System.out.println("올해는 " + today.getYear() + "년입니다.");

 

LocalDate otherDay = today.withYear(1982);

System.out.println("올해는 " + otherDay.getYear() + "년입니다.");

 


 오라클의 나즈혼은 자바스크립트의 기본 엔진으로 사용되었던 모질라의 리노(Rhino)가 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 노후화된 모습을 보완하기 위해 도입된 자바스크립트의 새로운 엔진입니다. 나즈혼은 리노에 비해 성능과 메모리 관리 면에서 크게 개선되었습니다.

 

3. 인터페이스와 추상 클래스의 각각의 특징과 차이점을 설명하시오.

👉🏻 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 아예 없거나 abstract로 정의된 경우를 말합니다. 반면 인터페이스는 모든 메소드가 추상 메소드인 경우입니다.(Java 8에서는 default 키워드를 이용해서 일반 메소드의 구현도 가능합니다.)

 추상 클래스는 일반 변수들과 생성자를 가질 수 있습니다. 어떤 클래스가 추상 클래스를 상속받을 때에는 extends를 씁니다. 클래스 안에 한 개 이상의 추상 메소드가 있다면 그 클래스 앞에는 반드시 'abstract 클래스명'으로 표기되어야 하며, abstract와 final 키워드를 동시에 표기할 수 없습니다. 추상 클래스는 오버라이딩의 강제성을 부여하는데, 추상 메소드를 오버라이딩 하지 않고는 객체 생성이 불가능합니다. 
 인터페이스는 인터페이스로부터 상속되는 클래스가 있다면 새로운 메소드에 대한 내용을 반드시 구현해야 합니다. 인터페이스는 final을 붙일 수 없고, 변수들은 static이어야 합니다. 즉, 일반 변수와 생성자를 가질 수 없습니다. 어떤 클래스가 인터페이스를 상속받을 때에는 implements를 씁니다. 클래스가 다른 클래스를 상속하면서 인터페이스를 구현하는 것도 가능한데, 이럴 때는 extends 다음에 implements를 순서대로 쓰면 됩니다. 자바는 다중상속이 불가능한데, 인터페이스는 이 다중상속을 대체합니다.

즉, 추상 클래스의 상속과 인터페이스의 상속의 차이점은 상속(abstract)의 목적은 클래스의 확장과 코드의 재사용이며 인터페이스 상속의 목적은 요구사항을 구현하는 것입니다.

 

4. Call by value와 Call by reference에 대해 설명하시오.

👉🏻 Call by value은 값에 의한 호출입니다. 함수가 호출될 떄, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성되는데 call by value 호출 방식은 전달되는 변수 값을 복사해서 함수 인자로 전달합니다. 이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가집니다. 따라서 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경되지 않습니다.

//출처-https://re-build.tistory.com/3
Class CallByValue{

public static void swap(int x, int y) {

int temp = x;
x = y;
y = temp;

}

public static void main(String[] args) {

int a = 10;
int b = 20;

System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);

swap(a, b);

System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);

}

}
//결과
/*
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20
*/

 

👉🏻 Call by reference는 참조에 의한 호출입니다. 이 호출 방식은 함수 호출 시 인자로 전달되는 변수 값이 아닌 주소(Address)를 넘겨줌으로써, 주소를 참조(Reference)하여 데이터를 변경할 수 있습니다. 따라서 함수 안에서 인자 값이 변경되면 전달된 객체의 값도 변경됩니다. 

//출처-https://re-build.tistory.com/3
Class CallByReference{

int value;

CallByReference(int value) {

this.value = value;

}

public static void swap(CallByReference x, CallByReference y) {

int temp = x.value;
x.value = y.value;
y.value = temp;

}

public static void main(String[] args) {

CallByReference a = new CallByReference(10);
CallByReference b = new CallByReference(20);

System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

swap(a, b);

System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

}
}
/* 결과
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10
*/

 

👉🏻 Java 호출 방식은 함수에 전달되는 인자의 데이터 타입에 따라 함수 호출 방식이 달라집니다. primitive type(원시 자료형)은 call by value 호출 방식을 사용합니다. 자료형에는 int, short, long, float, double, char, boolean이 있습니다. reference type(참조 자료형)은 call by reference 호출 방식이며 자료형에는 array, Class instance, String이 있습니다. String은 약간 특이한데, 참조 자료형이지만 Java에서 동작할 때는 원시 자료형처럼 적용됩니다.

정리하자면, Call by value의 경우 데이터 값을 복사해서 함수로 전달하기 때문에 원본 데이터가 변경될 가능성이 없습니다. 하지만 인자를 넘겨줄 때 마다 메모리 공간을 할당해야 하기 때문에 공간의 낭비가 일어날 수 있습니다.
Call by reference의 경우 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재합니다.

 

🔑 Database

5. DB에서 인덱스를 사용하는 이유는 무엇인지 설명하시오.

👉🏻 DBMS의 인덱스는 검색 속도를 높이기 위한 기술입니다. 인덱스는 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가(INSERT), 삭제(DELETE), 수정(UPDATE)하는 경우에는 쿼리문 실행 속도가 느려집니다. 즉, DBMS에서 인덱스는 데이터의 저장 성능을 희생하고 그 대신 데이터의 읽기 속도를 높이는 기능이라고 할 수 있습니다. 

인덱스를 사용하면 좋은 경우에는 WHERE절에서 자주 사용되는 Column, 외래키가 자주 사용되는 Column, JOIN에 자주 사용되는 Column이 있습니다. 반면 인덱스 사용을 피해야 하는 경우는 Data 중복도가 높은 Column, DML이 자주 일어나는 Column이 있습니다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30