안녕하세요 : )
SSAFYicial 9기 신산하입니다.
9기 여러분은 2학기 공통 프로젝트에 집중하시기 바쁘실 텐데요!
면접은 잡혔지만, 공부하시기 쉽지 않으실 겁니다.
오늘은 그런 교육생 분들을 위해 준비했습니다 +__+
이번 달의 기획 기사는 자바/Spring 관련 면접 질문 편입니다!
1. 객체지향과 절차지향의 차이는 무엇인가요?
객체지향
- 객체지향 프로그래밍이란 프로그램을 다수의 객체로 만들고, 이들끼리 서로 상호작용하도록 만듭니다. 예로 들면, 컴퓨터를 이루는 모니터 객체, 마우스 객체, 본체 객체 등이 있어 모든 부품을 적절히 연결하고 조립해서 컴퓨터가 제대로 작동하도록 만드는 것입니다.
- 대표적으로 JAVA가 객체지향 언어입니다.
절차지향
- 절차지향 프로그래밍은 개체를 순차적으로 처리해 프로그램 전체가 유기적으로 연결되어야 합니다. 자동차 제조로 예로 들면, 자동차는 엔진, 차체, 핸들, 의자, 바퀴 순으로 차례대로 만들어져야 합니다. 서로 분리되어도 안되고, 순서가 틀려도 안됩니다.
- 대표적으로 C 언어가 절차지향 언어입니다.
2. 객체지향 프로그래밍의 장점은 무엇입니까?
- 모듈화된 프로그래밍을 하여 재사용성이 높습니다. 이전 프로젝트의 설계도를 가지고 있으면 다시 활용할 수 있습니다.
- 유지보수가 쉽습니다. 절차지향 프로그래밍은 일일이 찾아 수정해야하는 반면에 객체지향 프로그래밍은 해당하는 부분만 수정하면 됩니다.
- 대형 프로젝트에 적합합니다. 클래스 단위로 모듈화 시켜서 개발 가능하기 때문입니다.
3. 객체지향 프로그래밍의 특징은 무엇입니까?
- Abstraction 추상화로 목적에 맞는 공통적인 속성과 기능을 추출하고, 필요없는 특성은 제거하는 과정입니다.
- Polymorphism 다형성으로 상속과 연관된 개념입니다. 자식클래스가 부모클래스를 상속받아 기능을 수정해 사용하는 오버라이딩 등 다양한 형태 형성이 가능합니다.
- Inheritance 상속으로 부모 클래스를 자식 클래스가 상속받아 새로운 클래스를 만들 수 있습니다.
- Encapsulation 캡슐화로 2가지의 의미가 있습니다. 1) 객체를 하나의 캡슐로 보는 관점이며, 객체 안에는 데이터와 알고리즘이 있습니다. 2) 정보 은닉의 개념으로 일부분은 감춰져있고, 일부분은 노출되어 있습니다. (public, private, default, protected)
4. JVM이란 무엇인가요?
- 자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트코드로 변환시켜줍니다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행을 못하는데 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM입니다.
- JVM을 사용하면 운영체제에 상관없이 같은 코드를 사용할 수 있습니다.
5. 컴파일과 인터프리터의 차이는 무엇인가?
고급 프로그래밍 언어를 기계가 이해할 수 있는 어셈블리어로 번역하는 방식은 컴파일과 인터프리터 2가지 방식이 있습니다.
컴파일러
- 컴파일러는 프로그램 전체를 스캔하여 이를 모두 기계어로 번역합니다.
- 초기 스캔을 마치면 실행파일을 만들어 놓고 다음에 실행할 때 이전에 만들어 놓았던 실행파일을 실행합니다.
- 컴파일러는 오류 메세지를 생성할 때 전체 코드를 검사한 후에 오류 메세지를 생성합니다. 그래서 실행 전에 오류를 발견할 수 있습니다.
- 대표적인 언어로 자바, C가 있습니다.
인터프리터
- 프로그램 실행 시 한 번에 한 문장씩 번역합니다.
- 인터프리터는 한 번에 한 문장씩 번역하기 때문에 프로그램을 실행시키고, 한 문장씩 번역될 때 오류를 만나게 되면 바로 프로그램을 중지시킵니다. 때문에 프로그램을 실행해봐야지만 오류 발견이 가능합니다.
- 대표적인 언어로 자바스크립트, 파이썬이 있습니다.
6. 가비지 컬렉션이란 무엇입니까?
- C/C++ 언어와 달리 자바는 개발자가 명시적으로 객체를 해제할 필요가 없습니다. 자바 언어의 큰 장점이기도 합니다. 사용하지 않는 객체는 메모리에서 삭제하는 작업을 Gargabe Collection(GC)라고 부르며 JVM에서 GC를 수행합니다.
7. Spring의 싱글톤 패턴에 대해 설명해주세요.
- 1개의 클래스당 1개의 객체만 생성됨을 보장하고 이 객체를 사용하는 디자인 패턴입니다.
- 객체가 무조건 한번만 생성되는것을 보장할 수 있습니다.
8. 자바 메모리 영역에 대해 설명해주세요.
메서드 영역
- static 변수, 전역 변수, 코드에서 사용되는 클래스 정보들이 올라갑니다.
스택
- 지역변수, 메서드 등이 할당되는 LIFO 방식의 메모리입니다.
힙
- new 연산자를 통해 동적할당된 객체들이 저장되고, 메모리는 가비지 컬렉션에 의해 관리됩니다.
9. 스프링과 스프링 부트의 차이점은 무엇인가요?
- 1) 스프링 부트는 Embed Tomcat을 사용하기 때문에, (Spring Boot 내부에 Tomcat이 포함되어있다.) 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어줍니다.
- 2) starter을 통한 dependency 자동화 :
과거 Spring framework에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고, 때문에 하나의 버전을 올리고자 하면 다른 dependeny에 까지 영향을 미쳐 version관리에 어려움이 많았습니다. 하지만, 이제 starter가 대부분의 dependency를 관리해주기 때문에 이러한 걱정을 많이 덜게 되었습니다.
- 3) XML설정을 하지 않아도 됩니다.
- 4) jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능합니다.
- 5) Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공합니다.
10. 스프링 프레임워크의 특징은 무엇인가요?
- 스프링 프레임워크의 특징은 POJO (Plain Old Java Object) 방식의 프레임워크입니다. 이 방식은 순수한 클래스만 만들어 놓고, 다양한 기능을 사용할 수 있게끔 만들었습니다.
- 서블릿을 만들 때는 단순한 클래스로만 서블릿을 사용할 수 없어 extends HttpServlet과 같은 기능을 붙여 사용한 것과는 대비되는 개념입니다.
- 때문에 스프링 프레임워크는 다양한 프레임워크는 물론 높은 확장성도 가지고 있습니다. (상속은 1개만 받을 수 있는데 extends를 아꼈다.)
- 의존성 주입을 통한 객체관계 구성이 가능합니다.
- 관점지향 프로그래밍이 가능합니다.
11. 스프링 DI에 대하여 아는대로 말씀해주세요.
(with. IoC)
- 의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법입니다. (new 연산자를 이용해서 객체를 생성하는 것이라고 생각하면 됩니다.)
- 만약 프로그래머 클래스 생성 시 생성자에서 데스크탑 객체를 만들면, 이는 프로그래머 클래스는 데스크탑 클래스에 의존하고 있다라고 표현합니다.
- 하지만 다른 메인 클래스에서 데스크탑 객체를 만들어 프로그래머 클래스에 전달해 프로그래머 객체를 생성한다면, 주입 받아 사용한다고 말합니다(DI). 또한 의존 관계가 역전(IoC) 되었다고 말할 수도 있습니다.
(추가 설명)
위의 코드는 프로그래머가 생성되는 타이밍에 데스크탑 객체를 생성해주는 코드입니다.
프로그래머 클래스는 일을 처리하기 위해 데스크탑 클래스의 도움을 받아야만 처리할 수 있습니다. 즉, 프로그래머 클래스는 데스크탑 클래스에 의존하고 있다라고 표현할 수 있습니다.
의존성을 제거하고 싶다면 new를 안해주면 됩니다.
즉, 프로그래머 생성 시 데스크탑을 만들어주는 것이 아니라 프로그래머에게 만들어져 있는 데스크탑을 주면 됩니다.
이것이 의존 관계 역전이라고 하는 것입니다. (IoC : Inversion of Control)
이제는 컴퓨터를 주입받아 사용하고 있네요. (DI)
12. 의존성 주입 방법을 아는대로 말씀해주세요.
생성자 주입
- 생성자를 통해서 의존 관계를 주입받는 방법입니다. 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈들을 주입합니다.
- 생성자 호출 시점에 1번만 호출되는 것을 보장합니다.
setter 주입
- setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존 관계를 주입하는 방법입니다.
- 선택과 변경 가능성이 있는 의존 관계에 사용합니다.
- @Autowired를 입력하지 않으면 실행이 되지 않습니다.
필드 주입
- 필드에 @Autowired를 붙여서 바로 주입하는 방법입니다.
- 필드 주입을 하게 되면 DI 컨테이너 안에서만 작동하게 됩니다. 따라서 순수 자바 코드로 테스트하기 어렵습니다.
과거에는 수정자, 필드 주입을 많이 사용했지만, 최근에는 대부분 생성자 주입 사용을 권장하고 있습니다.
그 이유는 의존 관계 주입은 처음 애플리케이션이 실행될 때 대부분 정해지고 종료 전까지 변경되지 않아야 하기 떄문입니다. 즉, 불변해야하기 때문입니다.
13. Bean이란 무엇인가요?
- spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부릅니다. 우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아닙니다.
- 즉 스프링 컨테이너가 생성한 객체들을 '빈'이라고 합니다.
14. 스프링의 MVC 진행 방식에 대해 말씀해주세요.
- 어떠한 입력이 들어왔을 때 처리하고 분배하는 행위를 컨트롤(CONTROL)이라고 합니다.
- 컨트롤러에서 요청받은 데이터를 처리하는 작업은 모델(MODEL)에서 처리합니다.
- 결과를 화면(뷰) 단에 구현합니다. (VIEW)
좀 더 자세한 내용은 다음과 같습니다.
- 1) 클라이언트가 요청을 보냅니다.
- 2) dispatcher servlet 수문장이 받아서 핸들러 맵핑에 보내줍니다. (with 필터)
- 3) 핸드러 맵핑은 "이 요청은 이러한 컨트롤러에 가면 있었어!"라고 dispatcher servlet한테 알려줍니다.
- 4) dispatcher servlet은 그대로 컨트롤러에게 줍니다.
- 5) 컨트롤러는 내가 처리할 수 있는 요청이니 service -> dao -> db를 거쳐 ModelAndView에서 model에선 데이터를 담아놓을 수 있고, view에선 이름을 가져와서 디스패쳐에 다시 돌려줍니다.
- 6) 디스패쳐는 뷰 이름을 가 져다가 뷰 리졸버에게 "이거 이름 줄테니까 정확하게 어디있는지 만들어와"라고 명령합니다.
- 7) 리졸버는 "여기 있습니다" 하고 디스패처에서 알려줍니다.
- 8) 모델 내가 가진 바구니를 뷰에 넘겨줍니다. jsp에서는 그 바구니를 가져다가 필요하면 데이터를 꺼내다가 우리에게 표현하고 응답을 디스패처에 보내줍니다.
- 9) 그 응답을 디스패처가 사용자에게 다시 돌려줍니다.
15. JWT의 장점은 무엇인가요?
- JWT 방식은 확장성에 큰 강점을 가집니다. 만약 세션을 사용하는 경우, 서버를 확장할 때마다 각 서버에 세션 정보를 저장하게 됩니다. 이렇게 될 경우, 특정 서버에서 로그인 인증을 받을 때 다른 서버에서는 로그인을 했는지 알 수 없다는 단점이 있습니다. JWT에서는 이를 해결합니다.
16. AOP에 대해 설명해주세요.
- 관점 지향 프로그래밍으로 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것입니다.
- 스프링 빈에만 AOP 적용 가능합니다.
- @Aspect 어노테이션을 이용해 해당 클래스가 Aspect임을 선언하고, before, after, after returning, after throwing, around라는 advice 타입에 따라 동작하게 합니다. 기준은 포인트컷 입니다.
- 포인트컷은 어떤 조인 포인트를 사용할지 결정하는 것입니다.
참고 문서
- 컴파일러와 인터프리터의 차이
- 스프링과 스프링 부트의 차이
- 그외 싸피에서 배운 지식들!
정말 중요한 질문들만 모은 이번 편!
면접을 앞두신 분들께 큰 도움이 되었으면 좋겠습니다 : )
모두들 취준 화이팅입니다!!
'대외활동 > SSAFYicial' 카테고리의 다른 글
[CS 정리는 내가 할게, 면접은 누가볼래? - 프론트엔드/React편] 프론트엔드/React 면접 질문 필수 암기 모음집 1탄 (2) | 2023.08.26 |
---|---|
[회고] 내가 만약 공통프로젝트 1일차로 돌아간다면? 공통프로젝트를 마치며 깨달은 것들 (7) | 2023.08.20 |
[잡페어/채용박람회] 면접부터 생생한 현장 후기까지! (0) | 2023.07.15 |
[CS 정리는 내가 할게, 면접은 누가볼래? - 네트워크편] 네트워크가 지연되는 4가지 이유 (with 패킷스위칭) (0) | 2023.06.22 |
[기업탐방] "꿈의 기업 삼성전자", 제가 생각하던 회사의 기준이 달라졌어요! (1) | 2023.06.21 |