CS
1. CORS란?
Cross-Origin Resource Sharing의 약자로, 기본값으로 제한되어 있는 다른 출처(도메인)의 리소스 요청을 허용 할 수 있게 해주는 것을 말한다.
2. RESTful이란?
자원을 요청할 때, 정의는 자원의 명칭으로 하고, 요청은 자원의 행동(메소드)으로 수행하는 것을 말한다. 대표적인 예로는 GET, POST, PUT, PATCH, DELETE가 있다.
3. HTTP 메소드의 종류와 각자의 역할은?
GET : URL로 정보를 검색하기 위해 서버에 요청하는 것.
POST : URL이 아닌 데이터 부분에 요청 정보를 담아 서버에 요청하는 것으로, 주로 입력의 역할을 한다.
PUT : POST와 같은 형식으로 요청 정보를 데이터 부분에 담아 보내지만, 리소스의 전체 내용을 변경할 때 이 요청을 사용한다.
PATCH : 리소스의 일부분만 수정할 때 사용한다.
DELETE : 요청 정보를 데이터 부분에 담아 보내며, 리소스를 제거할 때 사용한다.
그 외 HEAD, OPTIONS, TRACE, CONNECT가 있는데, 사용을 안 해봐서 감이 잘 안 잡힌다..
4. DB에서 인덱스를 사용하는 이유와 장점은?
DB에서 조회작업을 할 때 인덱스가 없을 경우 전체 테이블을 스캔(풀 테이블 스캔)하게 되어 레코드가 많아질 경우 시간이 매우 많이 소모가 되는데, 인덱스를 지정해주면 해당 데이터를 기반으로 검색을 할 때 이미 정렬되어 있는 인덱스 테이블을 통해 검색을 하게 되므로 검색 작업의 수행이 크게 빨라진다.
5. 트랜잭션이란?
DB에서의 하나의 작업 뭉치로, 한꺼번에 수행되어야 하는 작업의 최소단위를 말한다.
트랜잭션의 특징은,
작업은 성공시 전체가 반영되어야 하며, 실패시 하나도 반영되어선 안 된다는 점(원자성)
트랜잭션 중 발생한 DB의 변화는 트랜잭션에 영향을 주어서는 안 된다는 점(일관성)
트랜잭션이 다른 트랜잭션의 연산에 영향을 주어서는 안 된다는 것(독립성)
트랜잭션의 성공시 그 결과는 영구적으로 반영되어야 한다는 것(지속성)
6. JOIN이란?
테이블 간에 존재하는 관계 있는 필드로 테이블을 연결하는 것으로, 정규화 되어있는 테이블을 다시 연결할 때 사용한다. 크게 INNER JOIN, OUTER JOIN, LEFT JOIN, RIGHT JOIN으로 나뉜다.
7. RDBMS와 NOSQL의 차이는?
RDBMS는 스키마를 기반으로 한 명확한 데이터 구조를 가지기 때문에 형식을 보장하지만 그 형식이 유연하지 않아 스키마의 변경에 대응하기 어렵고, NOSQL은 스키마가 없기 때문에 자유로운 데이터 구조를 가져 언제든 필드를 새로 추가할 수 있다. 하지만 데이터의 중복 대처를 보증하지 않으며, 명확한 데이터 구조를 보장하지 않는다.
8. 배열과 링크드리스트의 차이는?
배열은 고정된 크기에 값을 삽입, 링크드리스트는 동적으로 관리 가능.
배열은 주소가 순차적으로 할당되지만 링크드리스트는 랜덤.
배열은 인덱스만 알면 데이터에 접근하는데 드는 시간복잡도가 O(1).
링크드리스트는 값을 찾기 위한 시간복잡도가 O(N).
배열은 값 삽입/삭제시 빈 공간이 존재하지 않도록 처리하기 위한 추가 처리를 시행하므로 비효율적.
링크드리스트는 값 사이의 연결을 끊고 다시 연결하는 방식을 취하기 때문에 효율적.
9. JWT란?
JSON Web Token의 약자로, 인증에 필요한 정보들을 암호화 시켜 사용하는 토큰을 말한다. 사용자의 인증 정보를 요청하는 방법 중 하나로 사용이 되는데, 클라이언트의 상태를 서버가 보관하기 위한 세션 서버가 필요하지 않기 때문에 서버의 확장성 측면에서 유리하다. 문제는 토큰을 탈취당하면 토큰이 만료되기 전까지 별도의 대처가 불가능하다는 점이다.
10. OAuth란?
인터넷 사용자가 자신의 개인정보(ID, 패스워드)를 제공하지 않고 인증 및 권한을 얻을 수 있도록(로그인) 하는 개방형 표준을 말한다. 신뢰할 수 있는 서비스 제공자의 보증을 통해 별도의 인증 없이 권한을 얻을 수 있게 해준다. 간편 로그인 또는 소셜 로그인으로 불리는 것이 이 표준을 이용한 대표적인 기능이다.
11. JWT와 OAuth의 차이는?
토큰 교환 방식이므로 둘은 유사해 보이지만 OAuth는 표준 자체를 말하는 것이고, JWT는 토큰의 형식으로 정의된 데이터이기 때문에 둘은 다르다.
12. JVM의 구조와 Java의 실행방식은 어떻게 되는가?
Class loader : 클래스를 로드하고, 런타임 데이터 영역에 배치하는 모듈
Runtime Data Area : JVM이 할당 받은 메모리 영역
Execute Engine : 런타임 데이터 영역에 배치된 바이트코드를 실행하는 모듈
Garbage Collector : 메모리 관리자. 유효하지 않은 메모리를 정리해주는 역할을 한다.
13. 제네릭이란?
클래스나 메소드에 사용되는 데이터 타입을 클래스 내부가 아닌 외부에서 사용자가 지정해 운용하는 방식을 말한다. 코드의 재사용성을 높일 수 있다는 장점이 있다.
14. 애노테이션이란?
인터페이스를 기반으로 한 문법의 일종으로, 특별한 몇 가지의 기능을 수행한다.
문법 에러 체크(@Override), 필요한 코드 자동 생성을 통한 중복 제거(Spring에서)등의 기능을 한다.
15. 오버라이딩과 오버로딩이란 무엇이며 어떤 차이가 있는가?
오버라이딩 : 상속받은 메소드를 재정의하여 다른 기능을 하도록 하는 것.
오버로딩 : 같은 이름의 메소드지만 파라미터를 다르게 하여 다른 기능을 하도록 하는 것.
차이점 : 오버라이딩은 상속받은 메소드의 파라미터까지 동일하지만 오버로딩은 파라미터가 달라야 성립한다.
16. 인터페이스와 추상클래스의 차이는 무엇인가?
인터페이스는 메소드의 내용을 작성 할 수 없음(default를 사용하지 않았을 때)
추상클래스는 메소드의 내용을 작성 할 수 있음
인터페이스는 다중 상속이 가능함
추상클래스는 다중 상속이 불가능함
일반적으로 인터페이스는 클래스의 애드온처럼 동작
일반적으로 추상클래스는 객체의 성격을 정의.
17. 객체지향이란?
프로그램을 메소드와 변수의 묶음인 객체(Object) 단위로 나누어 문제를 해결하는 프로그래밍 방법론으로, 독립성이 높은 작은 객체들로 쪼개어 생각한 뒤 이 객체의 조합으로 문제를 해결해 나가는 상향식(Bottom-Up) 방식을 취한다.
18. Spring DI/IoC는 어떻게 동작하는가?
의존성 주입을 시행하는 시점에 IoC에 등록된 Bean을 주입하는 방식으로 동작한다.
19. IoC 컨테이너의 역할은 무엇인가?
Bean을 인스턴스화 하고 조립하는 역할을 수행한다. 객체의 생성과 의존성 관리 역할을 수행한다.
20. DI의 종류는 무엇이고, 이들의 차이는 무엇인가?
필드 주입(field injection) : 필드의 선언 시점에 의존성을 주입하는것을 말한다. final 선언이 불가능해 불변성을 확보할 수 없고, 순환 참조를 런타임에서 확인할 수 있다는 문제점 때문에 권장되지 않는 방식이다.
수정자 주입(setter injection) : setter 메소드를 통해 변화 가능성이 있는 객체에 대한 선택적인 의존성 주입을 수행하는 것을 말한다. 객체를 선언하는 시점에서 의존성이 주입되지 않기 때문에 NullPointerException의 위험이 존재한다.
생성자 주입(constructor injection) : 생성자를 통해 의존성을 주입한다. final 선언을 통해 불변성을 확보할 수 있으며, 순환 참조를 런타임이 아닌 어플리케이션 구동 시점에서 확인할 수 있기 때문에 스프링에서 권장하는 의존성 주입 방식이다.
21. Spring Web MVC의 Dispatcher Servlet의 동작 원리는?
Spring MVC 패턴에서 기본적으로 사용하는 Servlet으로, 클라이언트의 요청이 있을 시 가장 앞단에서 요청을 가로채어(Front Controller) 요청에 매핑되는 Controller에 작업을 전달하고 비지니스 로직 처리 후 해당 결과 View를 클라이언트에 전달하는 역할을 한다.
22. Autowiring 과정은 어떻게 되는가?
컴포넌트 스캔을 통해 등록된 IoC 컨테이너 내의 Bean 중 Autowiring 대상으로 적합한 Bean을 찾아 스프링이 의존성을 주입해주게 된다.
23. POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 까?
Plain Old Java Object의 약자로, 특정 기술에 종속되지 않은 자바 본래의 장점을 살린 순수한 객체 그 자체를 말한다.
Spring Framework에서의 POJO는 ... 뭘까?
24. Spring에서 CORS 에러를 해결하기 위한 방법은?
1. CorsFilter 로 직접 response에 header 를 넣어주기
2. Controller 에서 @CrossOrigin 어노테이션 추가하기
3. WebMvcConfigurer 를 이용해서 처리하기
25. JPA란?
Java Persistance Api의 약자로, 자바의 ORM 표준을 말한다.
개발자가 직접 SQL을 작성하지 않아도 JPA가 적절한 SQL을 생성해 DB에 전달하고, 객체를 자동으로 매핑해주기 때문에 JDBC API를 활용할 때의 패러다임 불일치, SQL 의존성 등으로 인한 효율성 저하 문제를 완화할 수 있다.
26. N + 1 문제가 발생하는 이유와 이를 해결하는 방법은?
JPA를 통한 조회시 연관 관계 데이터를 함께 가져오지 않는 JPA의 특성으로 인해 발생하는 문제로, 연관 관계가 설정된 엔티티의 관계 데이터를 조회할 경우에 이 데이터를 읽어오기 위해 관계의 수만큼을 추가로 호출하는 문제를 말한다.
일반적으로 fetch join을 사용하여 프록시가 아닌 실제 엔티티를 조회하는 방식으로 하여 문제를 해결한다.
또는 EntityGraph 기능을 사용해 문제를 해결한다.
27. 대용량 트래픽에서 장애가 발생하면 어떻게 대응할 것인지?
Scale Out을 통한 부하 분산을 시도해야 할 것 같다.
28. 싱글톤 패턴이란?
객체가 필요한 영역마다 new 키워드를 통해 선언하여 사용하는 것이 아닌, 객체를 하나만 생성 하여, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴을 말한다. getInstance()로 대표된다.
29. TDD란? TDD에 대해서 어떻게 생각하는지?
테스트가 개발을 이끌어 나간다. 테스트를 먼저 만들고 테스트를 통과하기 위한 것을 짜는 것 즉, 만드는 과정에서 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고를 반복하면서 제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.
개인적으로 처음에는 TDD에 부정적인 견해를 가지고 있지만 지금은 설득력이 있는 방법론이라고 생각한다. 처음에는 기능 만들기에도 바쁜데 테스트코드를 먼저 작성한다는 점에 대한 거부감이 들었다. 하지만 항해99 과정에서 실전프로젝트를 진행하면서 생각이 조금 바뀌었는데, 프로젝트가 진행됨에 따라 프로젝트의 규모는 커지고, 요구사항은 계속해서 생겨나거나 수정되는데, 이 때 테스트코드를 사용하지 않으니 점점 기능의 검증 과정에 소모되는 시간이 길어지기 시작했고, 개발 효율은 감소하기 시작했다. 테스트 코드의 필요성을 느낀 계기였다. 이와 연계하여 TDD는 테스트코드를 잘 작성할 수 있다면 결론적으로는 프로젝트의 퀄리티를 상승시키고 개발 속도를 가속화 할 수 있는 방법론이 될 수 있다고 생각한다.
30. 인스턴스화 된다라는게 무슨의미인가?
클래스로부터 객체를 만들어 JVM의 메모리에 적재한 것을 말한다.
31. String과 StringBuffer의 차이점은?
불변성을 가진 String은 그 구조상 문자열에 변화가 발생할 경우 기존의 문자열 + 새로운 문자열을 가진 또다른 값을 가진 주소를 참조하는 방식을 취하기 때문에 유동적인 문자열의 변환에서 속도도 느리고 공간적으로도 비효율적인 구조를 가졌다. 이런 문제를 해결할 수 있는 것이 가변성을 가진 StringBuffer/StringBuilder이다. 애초에 값이 변하는 것을 전제로 만들어진 클래스기 때문에 동일한 인스턴스 내에서 값을 변화시킬 수 있게 된다.
32. MVC란?
MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있다. 이러한 "관심사 분리" 는 더나은 업무의 분리와 향상된 관리를 제공한다.
1. 모델: 데이터와 비즈니스 로직을 관리.
2. 뷰: 레이아웃과 화면을 처리.
3. 컨트롤러: 명령을 모델과 뷰 부분으로 라우팅.
33. JPA에서 Entity를 설계할 때 주의할 점은?
1. Entity에는 가급적 Setter를 사용하지 말 것.
Entity가 영속성이 유지되는 도중 수정되면 그 값은 DB에 그대로 반영되는데, Setter를 열어두고 값을 변경하는 경우에는 변경 포인트가 많아 유지보수가 어려워 질 수 있다.
2. 모든 연관관계는 지연로딩으로 설정할 것.
즉시로딩(EAGER)를 사용 할 경우, 어떤 SQL이 발생할지 추적하기 어렵고 N+1문제의 발생 위험이 생긴다.
3. 컬렉션은 필드에서 바로 초기화 할 것.
예를 들어, OneToMany 관계의 경우 필드에서 초기화를 해주지 않으면 NullPointerException의 위험이 존재하기 때문에 필드에서 초기화해주는것이 바람직하다.
34. Refresh Token을 사용했을 때 보안에 어떤 점이 좋은지?
수명을 길게 준 JWT 토큰이 탈취당할 경우 그 수명이 만료될 때까지 서버는 지속적인 보안 위협에 노출되는데, Refresh Token을 사용하면 JWT 토큰의 수명을 짧게 줄 수 있고, 이에 대한 위험 수준을 최대한 낮출 수 있다.
35. 어떤 코드가 좋은 코드인가?
개인적인 생각)
1. 한 달 뒤에 봐도 쉽게 이해할 수 있는 보기 좋은 코드
2. 재사용 할 수 있는 쓰기 좋은 코드
3. 동작 속도가 빠른 코드
세 가지를 만족할 수 있으면 좋은 코드라고 생각한다.
36. http VS 웹소켓의 차이?
HTTP : 클라이언트가 일방적으로 서버에 대한 정보만 요청하고, 통신이 완료되면 곧바로 연결을 끊는 단방향 통신이다.
웹소켓 : 서버도 클라이언트에게 요청을 보낼 수 있는 양방향 통신이다.
37. HATEOAS란?
Hypermedia As The Engine Of Application State의 약자로, REST Api를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는 것을 의미한다. 이러한 방법은 클라이언트가 서버로부터 어떠한 요청을 할 때, 요청에 필요한 URI를 응답에 포함시켜 반환하는 것으로 가능하게 할 수 있다.
예를 들어, 게시글의 정보에 대한 요청을 했을 때, 응답으로 상태 전이를 위한 동작(다음 글 보기, 이전 글 보기, 댓글 달기 등 .....)을 응답에 포함시키는 것이다.
38. 즉시 로딩과 지연 로딩의 차이는?
지연 로딩은 엔티티 조회 시점이 아닌 엔티티 내 연관관계를 참조할 때 해당 연관관계에 대한 SQL이 질의되는 기능이며, fetch=FetchType.LAZY 옵션으로 지정할 수 있다.
즉시로딩은 엔티티 조회 시 연관관계에 있는 데이터까지 한 번에 조회해오는 기능이며, fetch=FetchType.EAGER 옵션으로 지정할 수 있다. 즉시 로딩으로 조회된 엔티티의 연관관계 필드에는 실제 엔티티 객체가 반환된다.
39. WAS와 WS의 차이는?
정적인 컨텐츠를 제공하는지, 동적인 컨텐츠를 제공하는지에 차이가 있다.
was는 DB조회나, 어떤 로직을 처리해야하는 동적인 컨텐츠를 제공하는 서버이고, WS(웹서버)는 정적인 컨텐츠(html, css,js)를 제공하는 서버이다.
40. 아파치는 멀티 프로세스인가 멀티 쓰레드인가?
멀티 프로세스다.
41. 톰캣은 멀티 프로세스인가 멀티 쓰레드인가?
멀티 쓰레드다.
42. Call By Value와 Call By Reference의 차이는?
값에 의한 호출인지 참조에 의한 호출인지에 대한 차이점이 있다.
Call by value는 값에 의한 호출로써 복사하여 처리하게 때문에 안전하고, 원래의 값이 보존이되나 메모리 사용량이 늘어난다는 단점이 있다. 일반적인 변수가 이에 해당한다.
Call By Reference는 복사하지 않고 직접 참조 하기에 빠르지만 직접 참조하기 때문에 그만큼 원래 값이 영향을 받는다. 인스턴스가 이에 해당한다.
43. 스프링 프레임워크의 특징은 무엇인가?
Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리한다. 객체의 생성 및 소멸 그리고 라이프 사이클을관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있다.
특징으로는
POJO(Plain Old Java Object)기반 구성
DI을 통한 객체 간의 관계 구성
AOP(Aspect Oriented Programming)지원
편리한 MVC 구조
WAS에 독립적인 개발환경
44. DI 가 뭔지에 대해 DI와 객체지향관점을 연결지어 설명하자면?
의존성 주입으로써, 표준을 정의 할 수 있고, 정의된 표준을 바탕으로 같은 설계를 하게 해준다. 객체간의 의존관계를 설정 할 수 있으며, 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.
45. Garbage Collector란 무엇인가?
메모리 관리 방법 중에 하나로, 시스템에서 더이상 사용하지 않는 동적 할당된 메로리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.
46. 메모리에서 힙 영역과 스택 영역은 무엇인가?
1. Heap 영역은 생성된 인스턴스들이 동적으로 할당되는 메모리 공간이다. Heap 영역은 GC(Garbage Collector)에 의해 메모리 관리되고 있기 때문에, 할당된 인스턴스의 소멸시기는 GC에 의해 결정된다.
2. Stack 영역에는 지역변수와 매개변수들이 저장된다. Stack 영역에 할당된 매개변수, 지역변수들은 메소드의 호출이 끝나면 소멸된다.
47. 메모리에서 메소드 영역은 무엇을 하는가?
1. JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(Method) 데이터, 메소드 코드, 생성자(constructor) 코드 등 클래스와 인터페이스와 관련된 데이터들을 분류하고 저장한다.
2. 메소드(method) 영역은 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역이다. JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장한다.
48. 자바의 최상의 부모클래스가 무엇인가?
Object.
49. 직렬화(serialization)란?
직렬화란, 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술이다.
또한, JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.
50. final / finally / finalize()의 차이는 무엇인가?
1. final : 필드 또는 지역 변수 선언 시 사용 하며, 상태를 처음 선언 상태로 고정시키는 키워드이다. 인스턴스의 경우 인스턴스의 속성은 변경할 수 있다.
2. finally : try-catch문이 종료될 때 반드시 시행되는 블록이다.
3. finalize() : 객체가 소멸되는 시점에 호출하기로 약속한 메소드이다.
'내가 배운 것들 > 기타' 카테고리의 다른 글
[Mac] xcrun: error: invalid active developer path .... (0) | 2022.11.21 |
---|---|
[Docker] Docker의 Multi-stage build (0) | 2022.04.25 |
[nginx/Ubuntu] nginx 환경에서 https 기능 활성화 시키기 (0) | 2022.01.20 |
[Java] 문자열의 유사도 구하기 : 거리 알고리즘 (0) | 2022.01.18 |
[SQL] SELECT 구문 작동 순서 (0) | 2022.01.10 |
댓글