본문 바로가기
면접

[면접] 기술면접 대비하기 - Web 관련

by 공덕뉸나 2024. 3. 11.

이직 준비를 하다보니 면접 준비를 조금씩 하다가 최근에 면접을 보게 되면서 문서화 하고 블로그에도 공유하고 싶어 글을 쓰게 되었다.

기술면접에서 기본적인 개념도 질문하긴 하는데 내가 봤던 두군데는 거의 프로젝트 경험에 대한 질문이 많았다. 

질문 내용도 차차 풀어보려고 한다.

우선 기술면접을 대비하여 알아야할 것 같은 내용 몇 가지를 적어보려고 한다.

 

Q1. Spring 기본 동작 원리는?

A. Spring은 Java 기반의 애플리케이션을 개발하기 위한 프레임워크로, 핵심적인 개념은 IoC(Inversion of control)와 DI(Dependency Injection)입니다. IoC는 제어의 역전을 의미하며, 애플리케이션의 제어 흐름이 개발자가 아닌 프레임워크에 넘어가는 것을 의미합니다. DI는 의존성 주입을 의미하며, 객체 간의 의존성을 외부에서 주입하여 느슨하게 결합되도록 합니다.

애플리케이션의 동작은 ApplicationContext가 빈 객체들을 생성하고 의존성을 주입한 후, 필요에 따라 빈을 사용하여 작업을 수행합니다. Spring은 IoC와 DI를 통해 객체 간의 결합도를 낮추고 유연하고 확장 가능한 애플리케이션을 개발할 수 있도록 도와줍니다.

(*ApplicationContext는 IoC 컨테이너로서, 빈 객체들을 관리하고 생성함)

(*빈은 IoC 컨테이너에 등록되어 있는 객체를 말하며 XML이나 어노테이션을 통해 설정될 수 있음)

 

Q2. JVM 동작원리는?

A. JVM(Java Virtual Machine)은 자바 프로그램을 실행하는 가상 머신입니다. 자바 소스코드는 컴파일 되어 바이트 코드로 변환되고, JVM은 이 바이트 코드를 실행합니다.

JVM은 클래스를 로드하고 메모리에 올리며, 바이트 코드를 해석하거나 JIT(Just-In-Time) 컴파일러를 통해 네이티브 코드로 변환하여 실행합니다. 실행 중에는 메모리 관리와 가비지 컬렉션을 수행하여 프로그램의 안정성과 성능을 유지합니다.

올드 제네레이션으로 이동하는 과정은 JVM 메모리 관리에 중요한 부분입니다.

이 과정은 주로 새로운 객체의 생성 및 메모리 할당에 대한 부담이 커지고, 메모리가 일정 수준 이상으로 채워졌을 때 발생합니다.

 

Q3. gc(garbage collection) 동작이해

A. 자바 프로그램에서 메모리 관리를 위해 사용되는 중요한 기능입니다. 이를 통해 프로그램이 더 이상 필요하지 않은 객체를 식별하고 메모리를 해제하여 누수를 방지하고 성능을 최적화할 수 있습니다.

가비지 컬렉션은 프로그램의 실행 중지나 메모리 부족 시에 실행됩니다. 이때, 가비지 컬렉션 프로세스가 실행되어 더 이상 필요하지 않은 객체를 메모리에서 해제합니다.

이를 통해 가비지 컬렉션은 개발자가 메모리 관리에 대해 걱정할 필요없이 안정적으로 프로그램을 개발할 수 있도록 도와줍니다. 

이러한 자동화된 메모리 관리는 자바의 강력한 기능 중 하나이며, 프로그램의 성능과 안정성을 향상시킵니다.

gc는 자바 프로그래머가 직접 사용하는 것이 아니라, JVM이 자동으로 수행하는 것입니다.

 

Q4. Post / Send Message 차이점?

A. Post 방식은 HTTP에서 클라이언트에서 서버로 데이터를 보내는 방식 중 하나입니다. POST 요청은 요청 본문(body)에 데이터를 포함하고, 보안적인 이유로 민감한 정보를 전송할 때 사용합니다.

Send는 일반적으로메시지나 데이터를 전송하는 일반적인 용어입니다. 이 용어는 특정 한 프로토콜에 제한되지 않으며 이메일, 메신저, 소켓 통신 등 다양한 커뮤니케이션 방식에서 사용될 수 있습니다.

Send는 데이터를 한 곳에서 다른 곳으로 전송하는 일반적인 행위를 나타냅니다.

 

Q5. MVC 패턴이란?

A. MVC 패턴은 소프트웨어 개발에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 애플리케이션을 세 가지 역할로 나누어 개발하는 방법을 제공하며 코드의 구조를 단순화하고 유지보수성을 높입니다.

 

M의 Model은 애플리케이션의 데이터나 비즈니스 로직을 담당합니다. 데이터의 상태를 표현하고 데이터에 대한 처리 및 유효성 검사를 수행합니다. 주로 독립적으로 개발되며, 데이터베이스와의 상호 작용을 담당합니다.

 

V의 View는 사용자 인터페이스(UI)를 담당합니다. 모델의 데이터를 시각적으로 표현하고 사용자와의 상호 작용을 처리합니다. 주로 HTML, CSS, JavaScript 등을 사용하여 웹 애플리케이션의 화면을 구성합니다.

 

C의 Controller는 사용자의 입력을 처리하고, 그에 따라 모델과 뷰를 업데이트합니다. 클라이언트의 요청을 받아 해당 요청을 처리하는데 필요한 작업을 수행하고, 그 결과를 뷰에 반영합니다. 모델과 뷰 사이의 중재자 역할을 수행하여 양쪽 간의 결합도를 낮추고 유연성을 높입니다.

 

MVC 패턴을 사용하면 각 역할이 분리되어 유지보수와 확장이 쉬워지며, 코드의 재사용성과 확장성을 높일 수 있습니다. 또한 사용자 인터페이스와 비즈니스 로직을 분리하여 코드의 가독성과 유지보수성을 향상시킵니다.

 

Q6. JWT의 취약점은?

A. JWT의 취약점은 payload 정보 노출, 토큰 변조, 토큰 유효 기간 관리, 사용자 정보 무결성 보호, 크로스 사이트 스크립팅(XSS) 등이 있습니다.

 

payload 정보 노출

Base64로 인코딩된 형태로 페이로드 정보를 포함하고 있습니다. 이로 인해 토큰을 해독하여 페이로드 정보를 확인할 수 있는 경우, 민감한 정보가 노출될 수 있습니다.

 

토큰 변조

JWT는 한 번 발급되면 그 유효 기간이 만료될 때까지 계속 사용될 수 있습니다. 따라서 토큰의 만료 시간을 적절히 관리하지 않으면 잘못된 사용자가 토큰을 사용할 수 있습니다.

 

사용자 정보 무결성 보호

페이로드에 사용자 정보를 포함하기 때문에 해당 정보가 변조될 가능성이 있습니다. 이를 방지하기 위해서는 서명된 토큰을 사용하고, 토큰 검증 과정에서 토큰의 서명을 검증해야 합니다.

 

크로스 사이트 스크립팅(XSS)

JWT를 사용하는 웹애플리케이션에서는 XSS 공격에 취약할 수 있습니다. 악의적인 사용자가 JWT를 취득하여 다른 사용자의 계정에 대한 접근 권한을 얻을 수 있습니다.

 

이를 해결하기 위해서는 페이로드에 민감한 정보를 넣지 않고 토큰의 유효기간을 짧게 설정하고 주기적으로 갱신해야하며 HTTPS를 통한 통신을 통하여 안정성을 높여야합니다.

 

Q7. WAS vs WA

A. WAS는 Web Application Sever로 비즈니스 로직을 넣을 수 있고 Tomcat, PHP, ASP, .NET이 해당됩니다.

WS는 Web Server로 비즈니스 로직을 넣을 수 없고 Nginx, Apache가 해당됩니다.

 

Q8. @RequestBody, @RequestParam, @ModelAttribute의 차이는?

A. @RequestBody는 클라이언트가 전송하는 JSON 형태의 HTTP Body 내용을 MessageConverter를 통해 Java Object로 변환시켜주는 역할을 합니다. 값을 주입하지 않고 변환시키므로 변수들의 생성자, getter, setter가 없어도 정상적으로 할당됩니다.

@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해 사용하는데 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 합니다. 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해주면 됩니다.

@ModelAttribute는 HTTP Body 내용과 HTTP 파라미터의 값들을 생성자, getter, setter를 통해 주입하기 위해 사용하는데 값 변환이 아닌 주입시키므로 변수들의 생성자나 getter, setter가 없으면 변수들이 저장되지 않습니다.

 

Q9. SpringBoot와 Spring Framework는 어떤 차이가 있나?

A. Auto Configuration의 차이가 가장 큰 차이점입니다. Spring Framework는 프로젝트 초기에 다양한 환경설정을 해야하는 반면 SpringBoot는 설정의 많은 부분을 자동화하여 개발자가 편하게 Spring을 활용할 수 있도록 돕습니다.

SpringBoot는 내장된 톰캣을 제공하여 서버를 바로 실행할 수 있습니다. 

따라서 SpringBoot는 개발자가 빠르게 개발을 시작하고 간단한 프로젝트를 쉽게 구성하고 실행할 수 있도록 설계되어 있고 Spring Framework는 전통적인 웹 애플리케이션 개발에 적합하며 보다 세부적인 커스터마이징이 필요한 경우에 사용될 수 있습니다.

 

Q10. 관점지향 프로그래밍(AOP)는 무엇이고 언제 사용할 수 있나요?

A. AOP는 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화 하는 것을 의미합니다.

공통 모듈인 인증, 로깅, 트랜잭션 처리에 용이하며 핵심 비즈니스 로직에 부가기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용할 수 있습니다.

중복 코드를 제거하고 재활용성을 극대화하는 것이 장점입니다.

 

Q11. VO, DAO, DTO란 무엇인가?

A. VO(Value Object)란 실제 데이터만을 저장하는 객체를 말합니다.

DAO(Data Access Object)란 데이터베이스의 데이터에 접근을 위한 객체를 말합니다. Repository와 Mapper가 해당됩니다.

DTO(Data Transfer Object)란 각 계층간(Controller, View, Business 등)의 데이터 교환을 위한 객체를 말합니다.

 

Q12. Spring Security란 무엇이며 어떻게 작동하나요?

A. Spring Security는 Spring 기반의 자바 애플리케이션에서 보안 기능을 구현하기 위한 프레임워크입니다. 주로 웹 애플리케이션에서 사용되며 사용자 인증과 권한 부여를 효과적으로 처리하는데 도움을 줍니다.

동작원리는

1. Filter Chain : 여러개의 필터로 이루어진 필터 체인을 가지고 있고, 각 필터는 특정한 보안 작업을 처리하며 순차적으로 실행됩니다.

2. SecurityContextHolder, Authentication 객체 : 현재 인증 정보를 저장하고 authentication 객체를 통해 사용자의 인증 상태를 나타냅니다.

3. AuthenticationManager : 실제로 사용자의 인증을 처리하는데 사용됩니다.

4. AccessDecisionManager : 권한 부여를 결정하는데 사용됩니다.

 

Q13. Querydsl과 Spring Data JPA의 차이점과 장단점은?

A. Spring Data JPA는 JpaRepository 인터페이스를 사용하여 데이터베이스와의 상호 작용을 정의합니다. 개발자는 메서드 시그니처를 정의하고 Spring Data JPA가 제공하는 메서드 네이밍 규칙에 따라 자동으로 쿼리를 생성합니다. 간단한 쿼리에 대한 메서드 네이밍 규칙을 제공하여 개발 생산성을 향상시킵니다.

하지만 복잡한 쿼리를 작성하기에는 한계가 있고, 동적 쿼리에 대한 처리가 제한적일 수 있습니다.

Querydsl은 Predicate를 사용하여 동적 쿼리를 생성하고 실행합니다. 컴파일 시점에 오류를 검출할 수 있고 타입 안정성을 보장합니다. 동적쿼리를 쉽게 작성하고 관리할 수 있지만 간단한 쿼리에 대해서는 Spring Data JPA에 비해 코드가 길어질 수 있습니다.

 

실제로 받았던 질문도 포함하여 몇 가지 정리해 보았는데 추후에 추가할 내용이 생기면 수정하도록 해야겠다.

면접을 보다보니까 긴장돼서 알던 것도 말이 잘 안나오고 그랬는데 더 열심히 준비하고 학습해야겠다고 느꼈다.