💡 Restful API에 대해 설명해주세요.
- Restful API는 HTTP 통신을 REST 설계 규칙을 잘 지켜서 개발한 API를 말합니다.
- REST 설계 규칙이란 URI는 정보의 자원만 표시해야하며, 자원의 상태와 행위는 HTTP Method에 명시하는 것을 말합니다.
- 즉, 어떤 자원에 대하여 CRUD 연산을 수행하기 위해 특정 URI로 GET, POST 등의 메서드를 사용해 요청을 보내는 것을 말합니다.
- 이로써 Restful API는 각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능하다는 특징을 갖고 있습니다.
💡 프레임워크와 라이브러리의 차이에 대해 설명해주세요.
- 이 둘의 가장 큰 차이점은 제어 흐름에 대한 주도권이 누구에게/어디에 있는가에 있습니다.
- 프레임워크는 전체적인 흐름을 쥐고 있으며, 애플리케이션 코드는 프레임워크가 짜놓은 틀 안에서 수동적으로 동작하기 때문에 이 때 제어 흐름에 대한 주도권은 프레임워크에게 있다고 볼 수 있습니다.
- 반면 라이브러리는 개발자가 전체적인 흐름을 만들며, 필요할 때마다 라이브러리를 호출하여 사용합니다. 즉, 이 경우에는 개발자가 전적으로 제어 흐름에 대한 주도권을 가지고 있다고 볼 수 있습니다.
💡 Call By Value와 Call By Reference의 차이에 대해 설명해주세요.
- Call By Value(값에 의한 호출)
- Call By Value는 인자로 받은 값을 복사하여 처리하는 방식입니다.
- 값을 복사하여 처리하기 때문에 원래의 값이 보존되며, 이로인해 메모리 사용량이 증가한다는 특징이 있습니다.
- Call By Reference(참조에 의한 호출)
- Call By Reference는 인자로 받은 값의 주소를 참조하여 직접 저장해 값에 영향을 주는 방식입니다.
- 복사하지 않고 직접 참조하기 때문에 속도가 빠르며, 원래의 값이 영향을 받는다는 특징이 있습니다.
- 💡 그럼 Java에서 어느 부분이 call by value이고 어느 부분이 call by reference에 해당하나요?
- Java는 기본적으로 모든 전달 방식이 Call by Value입니다.
- 참조형의 경우 객체의 '주소값'을 매개변수로 전달하니 Call By Reference가 아니냐는 의문을 가질 수 있지만,
- 정확하게 말하면 '주소값'이 아니라, '주소를 가리키는 참조값'을 전달하는 것입니다.
- 또한, 주소값 자체를 '복사 없이' 인자로 전달하는게 아니라 자기 자신이 갖고 있는 값을 복사해서 전달하므로,
- 결국 기본형 변수나 참조형 변수 모두 자기 자신이 갖고 있는 값을 복사해서 전달하는 Call By Value 방식을 사용하고 있다고 볼 수 있습니다.
💡 CORS(교차 출처 리소스 공유, Cross-Origin Resource Sharing)에 대해 설명해주세요.
- CORS란 다른 Origin(출처)으로 요청을 보내기 위해 지켜야 하는 정책으로, 원래대로라면 SOP에 의해 막히게 될 요청을 풀어주는 정책이라고 볼 수 있습니다.
- SOP(Simple Origin Policy): 다른 Origin으로 요청을 보낼 수 없도록 금지하는 브라우저의 기본적인 보안 정책
- CORS에서 출처를 비교하는 로직은 서버에 구현된 스펙이 아니라 브라우저에 구현되어 있습니다.
- 즉, CORS 정책을 위반하는 리소스 요청을 하더라도 해당 서버가 같은 출처에서 보낸 요청만 받겠다는 로직을 가지고 있는 경우가 아니라면 서버는 정상적으로 응답을 하고, 이후 브라우저가 이 응답을 분석해서 CORS 정책 위반이라고 판단되면 그 응답을 사용하지 않고 그냥 버리는 순서로 진행되는 것입니다.
- 때문에, 브라우저를 통하지 않고 서버 간 통신을 할 때는 이 정책이 적용되지 않습니다.
- CORS 정책 위반으로 인한 문제를 해결하는 가장 대표적이고 정석적인 방법은, 서버에서 Access-Control-Allow-Origin 헤더에 알맞은 값을 세팅해주는 것입니다.
OPTIONS https://daegwonkim.tistory.com/rss 200 OK
Access-Control-Allow-Origin: https://daegwonkim.tistory.com
Content-Encoding: gzip
Content-Length: 699
Content-Type: text/xml; charset=utf-8
Date: Sun, 24 May 2020 11:52:33 GMT
P3P: CP='ALL DSP COR MON LAW OUR LEG DEL'
Server: Apache
Vary: Accept-Encoding
X-UA-Compatible: IE=Edge
💡 절차지향 프로그래밍과 객체지향 프로그래밍의 차이점에 대해 설명해주세요.
- 절차지향 프로그래밍
- 물이 위에서 아래로 흐르는 것처럼 순차적인 처리를 중요시하는 프로그래밍 기법으로, 대표적인 언어로는 C언어가 있습니다.
- 컴퓨터의 처리구조와 유사해 실행속도가 빠르며, 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다는 특징이 있습니다.
- 객체지향 프로그래밍
- 현실 세계의 사물들을 객체로 모델링하여 개발하는 프로그래밍 기법으로, 대표적인 언어로는 Java가 있습니다.
- 캡슐화, 상속, 다형성 등과 같은 기법을 이용할 수 있으며, 절차지향 언어보다 실행속도가 느리다는 특징이 있습니다.
💡 동적 쿼리란 무엇이고 언제 동적 쿼리를 사용하나요?
- 동적 쿼리란 실행시에 특정 조건이나 상황에 따라 쿼리 문장이 변경되어 실행되는 쿼리문을 말합니다.
- 컴파일시에 SQL 문장을 확정할 수 없는 경우나, 실행 시점에 따라 where절의 조건이 달라질 때 사용할 수 있습니다.
- 쿼리문이 변하냐 변하지 않느냐에 따라 정적쿼리/동적쿼리로 나눌 수 있습니다.
💡 CSRF(Cross-site request forgery)에 대해 설명하고, 이를 막기 위한 방법에 대해 설명해주세요.
- CSRF란 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말합니다.
- 즉, 정상적인 사용자가 의도하지 않았지만, 공격자가 만든 악성 페이지를 통해 자신도 모르게 서버를 공격하게 되는 것을 말합니다.
- CSRF 공격을 막기 위한 방법으로는
- 서버에서 사용자의 요청 헤더 정보에서 Referer 정보를 확인하여, 호스트와 Referer 값이 일치하는지 확인하는 방법과
- 임의의 CSRF 토큰을 만들어 세션에 저장해둔 뒤, 요청하는 페이지에 hidden 타입의 input 태그를 이용하여 토큰 값을 함께 전달받고, 이후 서버에서는 세션에 저장된 CSRF 토큰 값과 요청 파라미터에 담긴 토큰 값을 비교하는 방법이 있습니다.
💡 TDD(Test-Driven-Development)의 개념에 대해 설명해주세요.
- TDD란 작은 단위의 테스트 케이스를 작성하고 그에 맞는 실제 코드를 작성하여 테스트를 통과한 후에 상황에 맞게 리팩토링하는 테스트 주도 개발 방식을 말합니다.
- 이렇게 반복적인 단계가 진행되면서 자연스럽게 코드가 간결해지고 버그가 줄어든다는 장점이 있습니다.
- TDD는 레드 그린 사이클이라는 과정을 거칩니다.
- Red: 어떠한 기능을 검증하는 테스트를 실패하는 코드를 작성하고, 실제로 실패하는지 확인한다.
- Green: 어떠한 기능을 검증하는 테스트를 통과하는 코드를 작성하고, 실제로 성공하는지 확인한다.
- Refactor: 앞에서 실패하는 테스트와 성공하는 테스트를 모두 검증했다면, 작성한 코드를 깨끗하고 가독성 좋게 고친다.
- Repeat: 위 세 가지 과정을 반복하여 프로그램을 완성한다.
💡 테스트 코드를 작성 해야하는 이유에 대해 아는대로 설명해주세요.
- 기능의 추가, 변경, 삭제로 인한 영향도를 쉽게 파악 가능
- 예상하지 못한 오류에 대한 피드백을 위해
- 좋은 설계로 작성되게끔 코드를 유도
- 기능 정의의 문서의 역할
- 개발자의 실수를 줄여준다.
💡 DDD(Domain-Driven-Design)에서 얘기하는 계층과 각각의 역할에 대해 설명해 주세요.
- DDD란 도메인 주도 설계 방법으로, 여러가지 도메인들이 상호작용하며 비즈니스 도메인별로 나누어 설계하는 것을 말합니다.
- DDD의 핵심 목표는 높은 응집력과 낮은 결합도로, 각각의 도메인은 서로 철저히 분리되고, 변경과 확장에 용이한 설계를 얻도록 하는데에 있습니다.
- DDD의 계층 구조와 각각의 역할은 다음과 같습니다.
- 표현 계층(Presentation layer): 사용자의 요청에 대해 해석하고 응답하는 일을 책임지는 계층(Controller)
- Client로부터 request를 받고 response를 return하는 API 정의
- 응용 계층(Application layer): 비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 도메인 계층과 인프라스트럭처 계층을 연결해주는 역할을 하는 계층(Service)
- transaction 관리, DTO 변환, 모듈간의 연계를 진행
- 도메인 계층(Domain layer): 비즈니스 규칙, 정보에 대한 실질적인 도메인에 대한 정보를 가지고 있으며 이 모든것을 책임지는 계층(Entity)
- Entity를 활용하여 도메인 로직이 진행된다.
- 업무 상황을 반영하여 상태를 제어하는 역할에 집중하는 계층
- 인프라스트럭처 계층(Infrastructure layer): 외부와의 통신(ORM, DB, NoSQL)을 담당하는 계층(Repository)
- 해당 계층에서 얻어온 정보를 응용 계층 또는 도메인 계층에 전달하는 것을 주 역할로 담당
💡 MSA(Microservice Architecture)가 뭔지 설명해주세요.
- MSA는 모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장한 개념으로,
- 하나의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하는 것을 말합니다.
- 각각의 서비스는 API를 통해 데이터를 주고 받으며, 전체적으로 하나의 큰 서비스를 구성합니다.
- 장점
- 일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다.
- 각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다.
- 서비스의 확장이 용이하다.
- 단점
- 서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다.
- 서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다.
- 서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다.
📌 References
'🎤 Tech Interview' 카테고리의 다른 글
[Tech Interview] Part 9. Project (0) | 2023.07.09 |
---|---|
[Tech Interview] Part 7. Back-End (0) | 2023.06.03 |
[Tech Interview] Part 6. Operation System (0) | 2023.06.02 |
[Tech Interview] Part 5. Network (0) | 2023.05.29 |
[Tech Interview] Part 4. Algorithm (0) | 2023.05.24 |