일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- 백엔드 부트캠프
- UXUI기초정복
- UXUI챌린지
- 디자인챌린지
- 티스토리챌린지
- 내일배움카드
- 백엔드
- 내일배움캠프
- UXUIPrimary
- mysql
- 국비지원
- OPENPATH
- 국비지원교육
- Spring
- baekjoon
- 디자인교육
- 부트캠프
- 오블완
- Be
- 백준
- 디자인강의
- KDT
- 국비지원취업
- 패스트캠퍼스
- 오픈패스
- 백엔드개발자
- 오픈챌린지
- 객체지향
- 환급챌린지
- Today
- Total
군만두의 IT 공부 일지
신입 개발자 기술면접 예상 질문 정리 - 자바(2) 본문
1. CI/CD란? 적용해 본 적이 있나요?
CI/CD는 Continuous Integration(지속적 통합)과 Continuous Deployment/Continuous Delivery(지속적 배포/지속적 전달)의 약어입니다. CI는 개발자가 변경한 코드를 지속적으로 통합하고 빌드 및 테스트 과정을 자동화하여 코드의 품질을 보장하는 프로세스입니다. CD는 CI 이후 자동으로 배포 환경에 반영하는 것을 의미합니다. CI/CD를 통해 개발자는 더 빠르게 변경사항을 적용하고, 오류를 조기에 발견할 수 있습니다.
Jenkins, GitLab CI, GitHub Actions와 같은 도구를 사용해 CI/CD 파이프라인을 구축해본 경험이 있습니다. 이를 통해 코드의 자동 빌드, 테스트, 그리고 배포까지의 전체 프로세스를 자동화하여 개발과 배포의 효율성을 높였습니다.
CI/CD란 서비스 빌드부터 배포까지의 과정을 자동화하는 과정입니다. github로 코드 커밋 했을 때 해당 동작을 감지하여 jenkins 가 자동으로 빌드하도록 설계해 본 경험이 있다 등의 경험을 함께 이야기하면 좋습니다.
2. MVC 모델이란 무엇인지 설명해 보세요.
MVC(Model-View-Controller) 모델은 소프트웨어 설계 패턴으로, 애플리케이션을 세 가지 역할로 구분하여 개발의 효율성과 유지보수성을 높입니다.
Model은 애플리케이션의 데이터와 비즈니스 로직을 관리하고, View는 사용자에게 보여지는 화면을 담당하며, Controller는 사용자의 요청을 받아 모델을 업데이트하거나 뷰에 전달하는 역할을 합니다. 이를 통해 코드의 분리와 재사용성을 높이고, 여러 개발자가 동시에 작업하기에 용이한 구조를 제공합니다.
MVC 모델은 소프트웨어 디자인 패턴으로, 소프트웨어 애플리케이션을 구성하는 3가지 핵심 요소를 말합니다. 첫 번째 요소는 모델(model)입니다. 데이터와 비즈니스 로직을 관리하는 역할을 합니다. 두 번째 요소, 뷰(view)는 사용자에게 정보를 표시하고 모델(model)의 데이터를 가시화합니다. 세 번째 요소, 컨트롤러(controller)는 사용자 입력을 처리하고 모델과 뷰 사이의 상호 작용을 관리합니다.
MVC 모델의 장점은 세 가지로 설명할 수 있습니다.
첫 번째는 수정과 유지 보수의 수월함입니다. 각 구성 요소가 서로 독립적으로 개발되기 때문에 변경과 유지 보수가 쉽게 가능합니다.
두 번째는 재사용성입니다. 모델(model)과 뷰(view)는 다른 작업에서 재사용이 가능하며 컨트롤러(controller) 역시 다른 모델(model), 뷰(view)와의 조합하여 재사용할 수 있습니다.
세 번째는 테스트 용이성입니다. 각 컴포넌트를 독립적으로 테스트하기 쉽습니다.
MVC 패턴은 소프트웨어 애플리케이션 구성하고 유지보수하는 것에 도움이 되며, 각 역할과 책임을 명확하게 분배합니다.
3. Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해 보세요.
애노테이션(Annotation)은 자바 코드에 메타데이터를 제공하는 역할을 합니다. 주석과 비슷하지만, 컴파일러나 런타임에 특정 동작을 하도록 지시하는 데 사용됩니다.
예를 들어, @Override는 메서드가 부모 클래스의 메서드를 오버라이드하고 있음을 나타내며, 컴파일러가 이를 검사하도록 돕습니다. @Deprecated는 해당 요소가 더 이상 사용되지 않음을 알리며, @SuppressWarnings는 컴파일러 경고를 무시할 때 사용됩니다. 또한, 스프링 프레임워크에서는 @Autowired를 사용해 의존성 주입을 처리하는 등의 다양한 애노테이션이 사용됩니다.
Annotation은 클래스, 메서드, 파라미터, 필드 등에 특별한 표식을 남기기 위해 사용하는 것을 말합니다. Reflection을 이용할 시 특정 Annotation이 남겨진 클래스, 메서드, 파라미터, 필드 등에 값을 주입하거나 기록을 남길 수 있습니다.
예를 들어, @Autowired이라는 Annotation을 필드에 남긴다면 Bean Container가 해당 필드의 타입에 부합하는 Bean을 찾아 주입해 주는 기능을 합니다. @Component Annotation은 클래스에 남길 수 있으며, 이 클래스들은 Bean Container에 의해 인스턴스화되어 Bean으로 등록됩니다.
이와 같이 Annotation을 통해 표식을 남길 수 있고, 특수 프로세서를 통해 특정 업무를 처리할 수 있습니다.
4. DI와 IoC에 대해 아는 만큼 설명해 보세요.
DI(Dependency Injection)는 객체 간의 의존성을 외부에서 주입해주는 디자인 패턴으로, 코드의 결합도를 낮추고 테스트 용이성을 높여줍니다. 이를 통해 객체 간의 명시적인 의존 관계를 줄이고, 객체 생성과 의존성 관리를 프레임워크나 컨테이너에 맡길 수 있습니다.
IoC(Inversion of Control)는 제어의 역전이라는 개념으로, 객체의 생성과 의존성 관리를 개발자가 아닌 외부 컨테이너(Spring과 같은)에 위임하는 것을 의미합니다. DI는 IoC의 구현 방법 중 하나로, IoC를 통해 객체 간의 결합도를 줄이고 코드의 유연성과 재사용성을 높일 수 있습니다.
DI(의존성 주입)는 객체의 의존성을 외부에서 주입받는 기법입니다.
특정 기능이나 서비스를 외부에서 받아와서 사용하는 방식인데요. DI를 사용하면 클래스 내부에서 새로운 객체를 직접 생성하는 대신 외부에서 필요한 객체를 받아 사용할 수 있습니다. 이를 통해 모듈 결합도를 낮추고 코드 재사용성과 테스트 용이성을 향상할 수 있습니다.
IoC(제어 역전)은 프로그램 제어를 외부 요소에 위임하여 코드의 결합도를 낮추는 디자인 패턴입니다.
프로그램 제어 흐름 구조를 전통적 순차 제어 패턴에서 독립적인 모듈이 중앙 제어 코드 대신 사용자의 코드를 제어하게 됩니다.
모듈간의 결합도를 낮추어야 하는 이유는 이러합니다.
첫 번째로, 유지 보수 과정을 간소화하고 비용 절감에 도움이 되기 때문입니다. 결합도가 낮은 모듈은 다른 모듈의 변경에 대한 민감도가 낮습니다. 그렇기 때문에 한 개의 모듈 수정 과정에서 타 모듈에 영향을 줄 확률이 줄어듭니다.
두 번째로, 재사용성을 극대화해 개발 비용과 시간을 절약하기 위해서입니다. 모듈 결합도가 낮으면 다른 환경이나 프로젝트에서도 쉽게 재사용이 가능합니다.
세 번째로, 시스템 확장성과 유연성을 향상하기 용이하기 때문입니다. 기능의 변경 또는 추가가 필요할 때, 특정 모듈만 수정하거나 새 모듈을 추가하기 쉽습니다.
네 번째로, 시스템 전체에 대한 이해가 수월하기 때문입니다. 각 모듈이 독립적으로 동작하여 모듈 간의 의존성이 줄어들면서 시스템 전체를 파악하기 쉽습니다.
마지막으로, 오류의 파급 효과를 저지하기 위해서입니다. 낮은 결합도를 통해 한 모듈에서 발생한 오류가 타 모듈로 번지지 않도록 방지할 수 있기 때문입니다.
5. Spring Security의 구조에 대해 설명해 보세요.
Spring Security는 자바 애플리케이션에 인증(Authentication)과 권한 부여(Authorization)를 제공하는 강력한 보안 프레임워크입니다. 주요 구성 요소로는 SecurityContext와 Authentication 객체, FilterChain이 있습니다.
SecurityContext는 현재 사용자의 보안 정보를 저장하며, Authentication 객체는 사용자의 인증 정보를 담고 있습니다. Spring Security는 요청이 들어올 때 FilterChain을 통해 여러 필터를 거쳐 인증 및 권한 검사를 수행합니다. 또한 AuthenticationProvider와 UserDetailsService를 통해 사용자 정보를 확인하고 인증을 처리합니다. 이를 통해 애플리케이션의 보안을 강화하고, 세부적인 접근 제어가 가능합니다.
Spring Security는 다양한 보안 레이어 및 컴포넌트로 구성되어 있습니다. Authentication Manager, Security Filter Chain 그리고 UserDetailsService로 이루어져 있는 것이 가장 일반적인 구조입니다.
Authentication Manager는 사용자 인증을 처리하고 신원을 확인하는 역할을 합니다. In-Memory, JDBC, LDAP, OAuth 등 다양한 인증 프로바이더를 지원하며, 필요에 따라 커스텀 인증 로직을 구현할 수도 있습니다.
Security Filter Chain은 다양한 보안 필터가 연결된 필터 체인입니다. 요청을 처리하고 응답을 생성하기 전에 인증, 권한 부여, CSRF(Cross-Site Request Forgery) 방지 등 다양한 보안 검사를 수행합니다.
UserDetailsService는 사용자 정보를 제공하는 인터페이스입니다. 주로 데이터베이스나 사용자 저장소로부터 사용자 정보를 검색하여 인증 매니저가 사용자를 확인하는 데 사용됩니다.
6. JWT(Json Web Token)에 대해 설명해 보세요.
JWT(Json Web Token)는 두 개체 간에 정보를 안전하게 전송하기 위해 사용되는 JSON 기반의 토큰입니다. JWT는 주로 사용자 인증과 권한 부여에 사용되며, 토큰에는 클레임(claim)이라는 데이터가 포함됩니다.
JWT는 헤더, 페이로드, 서명으로 구성되며, 헤더는 토큰 타입과 알고리즘 정보를, 페이로드는 사용자 정보(예: 사용자 ID)를, 서명은 토큰의 무결성을 보장합니다. JWT를 사용하면 서버에서 세션을 관리하지 않고도 인증 상태를 유지할 수 있어 확장성이 뛰어납니다. 또한, Base64 URL 인코딩을 사용하여 토큰이 변조되지 않았음을 검증할 수 있습니다.
JWT(JSON Web Token)는 인증된 사용자에게 토큰을 발급하고, 이를 통해 사용자 신원을 확인하는 프로세스에 사용합니다. Spring Security에서 JWT를 사용하여 사용자 인증 및 권한 부여를 구현할 수 있으며, 보안 및 인증을 효과적으로 관리할 수 있습니다.
JWT(JSON Web Token)의 발급 과정에 대해 설명해 보겠습니다.
첫 번째로, 사용자가 자격을 증명할 수 있는 아이디 및 패스워드를 제출해 로그인을 시도하면 UserDetailsService를 통해 사용자 정보를 검색합니다. 또한 PasswordEncoder를 사용하여 비밀번호 일치 여부를 확인하여 사용자를 인증하고 신원을 확인합니다.
두 번째로, 그 뒤 사용자가 인증된다면 서버는 사용자 정보와 권한이 포함된 JWT(JSON Web Token)를 생성합니다. 이 생성한 토큰에 서명 키를 이용하여 서명하고, 클라이언트로 반환합니다. JWT(JSON Web Token)는 보통 HTTP 헤더에 포함되거나 응답 본문을 통해 전달됩니다.
세 번째로, 이후 사용자가 엔드포인트로 요청을 보낼 시 JWT(JSON Web Token)는 요청 Authorization 헤더나 쿼리 매개변수를 통해 서버로 전송되며, 서버는 클라이언트에게서 받은 JWT의 서명을 검증하고 만료 시간 및 기타 클레임 정보를 확인하여 유효성을 검사합니다.
만일 유효한 토큰일 시 요청한 리소스 내역에 대한 액세스를 허용하거나 거부하는 결과를 응답하며, 클라이언트는 JWT(JSON Web Token)에 포함된 권한에 따라 요청 작업을 수행합니다.
⭐참고자료
1) 한빛출판네트워크, "백엔드 기술 면접 TIP: 자바 기본 문법 예상 질문 5가지와 해설", 2024.02.08, https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS1626582373&cate_cd=
2) 제로베이스, "현직자가 말하는 신입 백엔드 개발 면접 질문 | 백엔드 스쿨", https://zero-base.co.kr/event/media_BE_school_qna
3) 스파르타코딩클럽, "2024 백엔드 면접 질문 문제은행 - 개발자 면접 준비 101", 2024.08.22, https://spartacodingclub.kr/blog/2024-backend-jobinterview-question
이 글은 참고자료를 바탕으로 각 질문에 대한 답변을 정리한 것으로, 틀린 부분이 있을 수도 있습니다.
'기타 > 기술면접' 카테고리의 다른 글
신입 개발자 기술면접 예상 질문 정리 - 공통(1) (0) | 2024.11.11 |
---|---|
신입 개발자 기술면접 예상 질문 정리 - 네트워크(1) (0) | 2024.11.10 |
신입 개발자 기술면접 예상 질문 정리 - 백엔드(2) (0) | 2024.11.07 |
신입 개발자 기술면접 예상 질문 정리 - 데이터베이스(1) (0) | 2024.11.06 |
신입 개발자 기술면접 예상 질문 정리 - 자바(1) (1) | 2024.11.05 |