카테고리 없음

[F-Lab 모각코 페이백 28일차] 팀코칭 질문 정리 (인터뷰 준비, 개념 학습)

everydeveloper 2023. 6. 16. 19:20

학습목표

  • 팀코칭 질문 답변

 

TIL

  • 개념 학습 (복습)
  • 인터뷰 정리

 

WEB이란 무엇일까요?

웹(Web)은 인터넷에 연결된 컴퓨터들 사이에서 정보를 공유하고 접근할 수 있게 만든 시스템을 말합니다. 웹은 일반적으로 월드 와이드 웹(World Wide Web, WWW)이라고도 부르며, 이는 HTTP라는 프로토콜을 통해 문서, 이미지, 비디오, 음악 등 다양한 형태의 정보를 전송하고 공유할 수 있게 해줍니다. 웹은 브라우저를 통해 화면으로 볼 수 있습니다.

 

JDBC는 무엇이고, 장점은 무엇인가요?

자바에서 지원하는 여러 DB와 호환대응하기 위해 만들어진 인터페이스입니다. JDBC를 이용해 다양한 DB와 연결 후 사용 할 수 있습니다.

 

스프링 프레임워크와 스프링 부트에 대해 말씀해 주세요

스프링 프레임워크는 IoC와 DI를 사용하는 자바 프레임워크입니다. 개발자는 핵심 로직에 집중 할 수 있도록 스프링 시큐리티, 스프링 트랜잭션 같은 도구와 기능등을 탑재하고 있습니다. 스프링 부트는 기능과 역활이 동일합니다. 스프링 부트는 스프링 프레임워크를 좀 더 쉽게 이용 할 수 있도록 디팬더시와 디팬더시 설정들이 편리하고 쉽게 셋팅할 수 있게 구조화 되어있습니다. 스프링 부트는 따라서 쉽게 다룰 수 있지만 결국 스프링 프레임워크라 스프링을 질 알지 못한다면 여러경우에 대처하지 못할 수도 있습니다

 

스프링 부트가 나오게 된 이유는?

스프링 부트는 스프링 프레임워크이지만 스프링 프레임워크가 양이 빙대하다보니 힉습곡선이 좀 완만합니다. 따라서 비교적 쉬운 스프링 부트가 나오게 된 것 같습니다.

 

프레임워크의 뜻은??

프레임워크는 소프트웨어의 특정 문제를 해결하기 위해 재사용 가능한 기본 구조를 제공하는 도구입니다. 이는 개발자가 새로운 애플리케이션을 빠르게 구축하도록 도와주며, 코드의 일관성과 효율성을 높여줍니다.

 

라이브러리와 프레임워크를 선택할 수 있다면 어떤 것을 선택하실 건가요? 

저는 프레임워크를 선택 할 것 같습니다. 라이브러리도 중요하지만 저에게는 프레임워크가 주는 이득이 더 클 것 같습니다. 어노테이션과 여러가지 지원되는 기본 기능이 지금의 저에게는 라이브러리 선택보다 이득이 큰 것 같습니다.

 

SOLID 개발 원칙에 대해 말씀해주세요

솔리드 개발원칙에는 단일 책임 원칙, 개방 폐쇠의 원칙, 리스코브 치환의 원칙, 인터페이스 분리의 원칙, 의존성 역전의 원칙이 있습니다. 이 다섯가지 개발원칙은 객체지향적 개발에 중점을 둔 개발 원칙으로 알고 있습니다

 

SOLID 원칙이 만들어진 이유는?

여러 연구자와 개발자들이 어떻게 개발을 잘 할 수 있을까 고민하고 생각한 결과라고 생각합니다. 이렇게 하니 이런 장점이 있고 이렇게 안하니 이런 단점이 있고 이걸 이렇게 해보면 어떨까 해서 오랫동안 축적해서 나온 경험과 산물이라고 생각합니다 

 

디자인 패턴에 대해 말씀해 주세요 (어댑터, 싱글톤, 팩토리)

어댑터 패턴은 월래 기존의 인터페이스에 다른 호환이 안되는 인터페이스가 있으면 그 사이에서 호환이 되도록 하는 기능과 역활을 추가하는 것을 어댑터 패턴이라고 합니다. 싱글톤 패턴은 클래스의 인스턴스를 한개만 생성하도록 해서 이 것을 쭉 상용하는 패턴입니디. 객체지향적이지는 않지만 몇몇의 경우에 이 디자인 패턴이 효율적이고 좋을 때가 있습니다. 팩토리 디자인 패턴은 객체 생성 로직을 별도의 메소드나 클래스에 분리하여, 필요에 따라 다양한 타입의 객체를 유연하게 생성할 수 있게 하는 디자인 패턴입니다.

 

싱글톤, 팩토리, 어댑터 패턴이 만들어진 이유는?

싱글톤 패턴은 전역 변수의 사용을 피하고, 공유 자원에 대한 동시 접근을 제어하는 등의 목적으로 만들어졌습니다. 이로써 애플리케이션 전체에서 하나의 인스턴스만 유지해야 하는 경우에 유용합니다. 팩토리 패턴은 객체를 생성하는 과정에서 필요한 로직이 복잡하거나, 같은 인터페이스를 가지고 있지만 다른 행동을 하는 여러 종류의 객체를 유연하게 생성하고 싶을 때 사용하게 됩니다. 이 패턴은 클라이언트와 객체 생성 로직 사이의 결합도를 줄여 코드 유지보수를 용이하게 하기 위한 목적으로 만들어졌습니다. 어댑터 패턴은 기존 클래스의 인터페이스를 새로운 인터페이스로 변환하여, 기존 클래스가 새 환경에 맞게 동작하도록 하는 것이 필요할 때 사용합니다. 이 패턴은 기존 코드를 재사용하면서 새로운 요구사항을 충족시키기 위한 목적으로 만들어졌습니다.

 

IoC(제어의 역전), DI (의존성 주입)에 대해 설명해주세요

제어의 역전은 프레임워크가 빈으로 등록 된 객체를 생성하여 미리 등록 된 곳에 자동으로 주입해주는 것 입니다 기존에는 인스턴스의 객체를 new 키워드로 생성해서 파라미터로 넣어주었으나 이런 부분은 프레임워크의 제어의 역전으로 인해 개발자가 딱히 신경쓰지 않아도 됩니다.제어의 역전으로 등록 된 빈들이 객체로 생성되어 주입되는 것을 의존성 주입이라고 합니다.스프링 프레임워크의 애플리케이션 컨텍스트에서 제어의 역전으로 의존성 주입을 해줍니다.

 

만약 IoC가 없다면 어덯게 해야 할까요?

개발자가 일일이 다 객체를 생성하고 생성된 객체를 파라미터로 넣어주고 해야 할 것 같습니다. 객체의 생명주기를 개발자가 관여해야 합니다.

 

의존성 주입방법에 대해 말씀해주세요

의존성 주입에는 생성자 주입, 세터 주입, 필드 주입이 있습니다. 예전에는 필드 주입을 많이 쓰는 곳도 있었지만 요즘은 생성자 주입을 많이 추천하는 편입니다.

 

생성자 주입방법, 세터 주입방법 장단점과 추천 방법은?

생성자 주입 장점: 1. 객체의 불변성을 보장합니다. 2. 필수적인 의존성을 명확하게 표현합니다. 단점: 1. 의존성이 많아질수록 생성자가 복잡해집니다. 2. 객체를 생성한 후에는 의존성을 변경할 수 없습니다. 세터 주입 장점: 1. 선택적인 의존성을 다룰 수 있습니다. 세터 메소드를 통해 필요에 따라 의존성을 추가하거나 변경할 수 있습니다. 2. 의존성이 많아져도 세터 메소드는 각각 따로 정의되므로, 생성자보다는 복잡성이 덜합니다. 단점: 1. 객체 생성 후에도 의존성이 변경될 수 있어, 객체의 상태를 예측하기 어렵습니다. 2. 모든 세터 메소드가 호출되지 않을 수 있어, 객체가 완전히 초기화되지 않은 상태로 남아있을 가능성이 있습니다. 이는 애플리케이션의 안정성을 위협할 수 있습니다.

 

Stack이란 ? Stack의 문제점 ?

스택(Stack)은 데이터를 저장하는 추상적인 자료구조 중 하나로, 데이터의 추가(푸시)와 제거(팝)가 같은 '최상위' 끝에서 일어나는 LIFO(Last In First Out) 원칙을 따릅니다. 즉, 가장 마지막에 들어간 요소가 가장 먼저 나옵니다. 스택의 장점은 데이터의 삽입과 삭제가 빠르다,구현이 간단하다, 함수 호출, 괄호 검사 등 다양한 알고리즘에서 사용될 수 있다. 가 있습니다. 스택의 문제점으로는 스택의 크기가 고정되어 있을 경우, 스택 오버플로 또는 스택 언더플로가 발생할 수 있습니다. 또한 스택의 중간 요소에 접근하기 어렵습니다. 중간 요소에 접근하려면 스택의 상단부터 차례로 데이터를 제거해야 하므로 비효율적입니다.

 

스프링 AOP에 대해 말해주세요

 

스프링 AOP(Aspect-Oriented Programming)는 애플리케이션에서의 관심사(Concern)를 분리하여 모듈화하는 프로그래밍 패러다임입니다. AOP는 OOP(Object-Oriented Programming)를 보완하여 코드의 재사용성, 모듈성, 유지보수성을 향상시키기 위해 사용됩니다.

 

스프링 AOP는 횡단 관심사(Cross-cutting Concerns)를 해결하기 위해 사용됩니다. 횡단 관심사는 애플리케이션의 여러 모듈 또는 객체들에 공통적으로 적용되는 기능이며, 주요 비즈니스 로직과는 별개로 존재합니다. 예를 들어, 로깅, 트랜잭션 관리, 보안, 캐싱 등은 횡단 관심사에 해당합니다. 이러한 횡단 관심사를 별도의 모듈로 분리하고 필요한 곳에 적용하는 것이 AOP의 목표입니다.

 

스프링 AOP는 다음과 같은 주요 개념과 구성 요소를 갖습니다:

 

1. 관점(Aspect): 횡단 관심사를 모듈화한 것으로, 주요 비즈니스 로직과는 독립적으로 존재합니다. 관점은 특정한 기능을 정의하고, 어디에 적용할지를 결정합니다. 예를 들어, "트랜잭션 관리"는 하나의 관점으로 볼 수 있습니다.

 

2. 조인 포인트(Join Point): 관점이 적용될 수 있는 프로그램 실행 지점을 의미합니다. 메서드 호출, 메서드 실행 전/후, 필드 접근 등이 조인 포인트에 해당합니다.

 

3. 어드바이스(Advice): 관점에서 수행되는 실제 기능을 정의합니다. 어드바이스는 조인 포인트에서 실행되는 코드로, 횡단 관심사를 구현합니다. 어드바이스의 종류로는 "전처리 어드바이스(Before Advice)", "후처리 어드바이스(After Advice)", "예외 처리 어드바이스(Exception Handling Advice)", "최종 처리 어드바이스(After-Returning Advice)" 등이 있습니다.

 

4. 포인트컷(Pointcut): 어떤 조인 포인트에 어드바이스를 적용할지를 선택하는 기준을 정의합니다. 포인트컷은 정규 표현식이나 메서드 이름 패턴 등으로 표현될 수 있습니다. 예를 들어, "모든 서비스 계층의 메서드"를 선택

 

OOP(Object-Oriented Programming)는 뭐야??

 

OOP(Object-Oriented Programming)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 객체들의 모음으로 구성하고 객체들 간의 상호작용을 중심으로 프로그래밍하는 방법론입니다. OOP는 현실 세계의 사물이나 개념을 추상화하여 프로그램의 구조를 설계하고 구현하는 데 사용됩니다.

 

OOP에서 객체(Object)는 데이터와 해당 데이터를 조작하는 메서드의 결합체입니다. 객체는 특정한 특성(속성 또는 멤버 변수)과 그 특성에 대한 동작(메서드)을 가지고 있습니다. 예를 들어, 자동차라는 객체는 속성으로는 색상, 모델, 속도 등을 가지며, 동작으로는 가속, 감속, 정지 등을 수행할 수 있습니다.

 

OOP의 주요 개념은 다음과 같습니다:

 

1. 클래스(Class): 클래스는 객체를 생성하기 위한 설계도 또는 템플릿입니다. 클래스는 속성과 동작을 정의하며, 객체의 공통적인 특성을 나타냅니다. 예를 들어, 자동차 클래스는 모든 자동차 객체에 대한 공통적인 특성과 동작을 정의합니다.

 

2. 객체(Object): 클래스의 인스턴스로, 실제로 메모리에 할당되어 동작하는 단위입니다. 객체는 클래스의 속성과 동작을 가지며, 고유한 상태를 유지할 수 있습니다. 예를 들어, 자동차 클래스의 객체로는 "BMW 3시리즈, 검정색, 0km/h"와 같은 구체적인 자동차가 있을 수 있습니다.

 

3. 상속(Inheritance): 상속은 클래스 간의 관계를 표현하는 메커니즘으로, 한 클래스가 다른 클래스의 속성과 동작을 상속받을 수 있습니다. 상속을 통해 코드의 재사용성과 계층적인 구조를 구성할 수 있습니다.

 

4. 다형성(Polymorphism): 다형성은 한 객체가 여러 가지 타입을 가질 수 있는 능력을 말합니다. 다형성을 통해 동일한 메서드를 호출하더라도 실제로 실행되는 코드는 객체의 타입에 따라 달라질 수 있습니다. 이를 통해 유연하고 확장성 있는 코드를 작성할 수 있습니다.

 

5. 캡슐화(Encapsulation): 캡슐화는 객체의 속성과 동작을 외부로부터 감추고, 외부에서 접근할 수 있는 인터페이스를 제공

 

OOP가 객체지향 프로그래밍 약어였어?

 

네, 맞습니다. OOP는 "Object-Oriented Programming"의 약어입니다. 객체지향 프로그래밍은 이러한 OOP 개념을 기반으로 한 프로그래밍 패러다임을 의미합니다.

 

AOP를 사용해서 구현해 낼 수 있는 것이 뭐가 있을까요?

 

AOP를 사용하여 다양한 기능을 구현할 수 있습니다. 주요한 예시들은 다음과 같습니다:

 

1. 로깅(Logging): AOP를 사용하여 애플리케이션의 로그를 자동으로 생성하고 관리할 수 있습니다. 메서드 호출 전후에 로그를 기록하거나, 예외가 발생할 때 로그를 기록하는 등의 로깅 기능을 AOP를 통해 구현할 수 있습니다.

 

2. 트랜잭션 관리(Transaction Management): AOP를 사용하여 애플리케이션의 트랜잭션을 관리할 수 있습니다. 특정 메서드나 메서드 그룹에 트랜잭션을 자동으로 적용하거나, 트랜잭션의 시작과 커밋, 롤백을 AOP를 통해 처리할 수 있습니다.

 

3. 보안(Security): AOP를 사용하여 애플리케이션의 보안 기능을 구현할 수 있습니다. 특정 메서드나 메서드 그룹에 대한 접근 제한을 설정하거나, 권한 검사를 자동으로 수행하는 등의 보안 관련 기능을 AOP를 통해 구현할 수 있습니다.

 

4. 캐싱(Caching): AOP를 사용하여 데이터의 캐싱 기능을 구현할 수 있습니다. 특정 메서드의 결과를 캐시에 저장하고, 동일한 요청이 있을 때 캐시된 데이터를 반환하여 성능을 향상시킬 수 있습니다.

 

5. 예외 처리(Exception Handling): AOP를 사용하여 애플리케이션의 예외 처리를 구현할 수 있습니다. 예외 발생 시 특정 로직을 수행하거나, 예외를 변환하거나, 예외를 처리하는 등의 예외 처리 기능을 AOP를 통해 구현할 수 있습니다.

 

6. 성능 모니터링(Performance Monitoring): AOP를 사용하여 애플리케이션의 성능 모니터링을 구현할 수 있습니다. 메서드의 실행 시간을 측정하거나, 호출 횟수를 카운트하는 등의 성능 관련 정보를 수집할 수 있습니다.

 

위의 예시들은 AOP 사용하여 구현할 있는 대표적인 기능들이지만, AOP 매우 유연한 개념이므로 다양한 기능과 적용 영역에 사용될 있습니다. 실제로 AOP 애플리케이션의 여러 측면에서 코드의 재사용성, 모듈성, 유지보수성을 향상시키는 도움을 있습니다.