- Http Method에 대해서 설명해 주세요.
- MVC
- 오버로딩 오버라이딩
- IoC(Inversion of Controller) 컨테이너
- Spring은 IoC 컨테이너를 제공합니다. 이를 통해 개발자는 객체를 직접 생성하고, 관리하고, 연결하는 대신 Spring에게 필요한 객체들을 생성하도록 요청할 수 있습니다. 이를 통해 코드의 유지보수성과 확장성을 향상시킬 수 있습니다.
- 의존성 주입(DI, Dependency Injection)
- Spring은 DI를 제공합니다. 이는 객체 간의 의존성을 외부에서 관리하는 기술입니다. 이를 통해 코드의 객체 간의 결합도를 낮추고 유연성과 재사용성을 향상시킬 수 있습니다.
- 관점 지향 프로그래밍 AOP(Aspect Oriented Programming)
- Spring은 AOP를 제공합니다. 이를 통해 공통 로직을 분리하여 개발자가 비지니스 로직에만 집중할 수 있도록 도와줍니다. 이를 통해 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
- Spring과 Spring Boot의 차이점에 대해 각각 설명해 주세요.
- Spring
- 기업용 애플리케이션을 개발하기 위한 대규모 프레임워크
- Java EE의 여러 기능들을 대체하면서도 호환 가능
- IoC 컨테이너와 DI, AOP, MVC 프레임워크 등 다양한 기능을 제공
- 애플리케이션 개발시 많은 구성 요소와 설정이 필요함
- Spring Boot
- Spring 기반 애플리케이션을 더욱 쉽게 개발하도록 도와주는 도구
- Spring Boot는 설정이 적고, 자동 구성이 가능
- 기본 설정값으로 모든 것이 자동으로 설정 되며, 내장형 웹 서버(톰캣)가 함께 제공
- 자동 구성이라는 개념을 사용하여, 애플리케이션을 실행하는 데 필요한 라이브러리와 설정을 자동으로 추가
- Bean이란 무엇인가요?
- Bean이란 Spring에서 관리하는 객체를 의미합니다. 객체지향의 객체와 비슷하지만, Spring에서 사용하기 위해서는 정해진 규약과 설정이 필요합니다. Bean은 Spring IoC 컨테이너에 등록되어, 필요한 곳에서 참조하여 사용됩니다.
- Bean Scope: 생성된 Bean을 어디까지 사용할 수 있는지를 결정하는 것
- Singlton
- Prototype
- Request
- Session
- GlobalSession
- Spring으로 개발하실 때 어떠한 DI 방식을 사용하시나요? 사용하는 이유는 무엇이 있는 걸까요?
- 제가 사용하는 DI 방식은 생성자 주입입니다. 이 방식은 클래스의 생성자를 통해 필요한 의존 객체를 주입받는 방식으로, 필요한 객체를 외부에서 전달받아 사용하기 때문에 의존성이 강한 코드를 작성하지 않아도 되고, 코드의 가독성도 높아집니다. 또한, 생성자 주입 방식은 필수적으로 필요한 의존 객체를 생성자 인자로 전달하기 때문에 Bean이 올바르게 초기화 되어 있는지 컴파일 타임에 확인할 수 있습니다.
- Field Injection를 왜 사용하면 안된다고 하는 것인가요?
- 필드에 직접 @Autowired를 사용해서 의존성을 주입하는 방법입니다.
- 이 방법은 테스트하기 어렵고, 코드의 복잡성을 증가시키며, 런타임 시점에 발견하기 어려운 문제가 있을 수 있습니다. 예를 들면 컴파일 타임에 의존성이 없어서 런타임 에러가 발생할 가능성이 높아집니다. 또한 순환 참조 문제가 발생할 수도 있습니다.
- Transaction
- 트랙잭션은 데이터베이스 내에서 수행되는 작업의 최소 단위로, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 기능을 수행합니다. 트랙잭션은 하나 이상의 query를 포함해야 하고, ACID라고 칭해지는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 만족해야합니다.
- Deadlock
- 데이터베이스 deadlock(교착 상태)이란, 여러 트랜잭션들이 각각 자신의 데이터 대하여 lock을 흭득한 상태에서 상대방 데이터에 접근하고자 대기를 할 때 교차 대기를 하게 되면서 서로 영원히 기다리는 상태를 말합니다.
- 예방기법
- 회피기법
- 탐지/회복 기법
- index
- 인덱스는 데이터베이스에서 table의 검색 성능을 높여주는 대표적인 방법중 하나 입니다.
- Java 8 버전에 추가된 중요 기능들에 대해서 설명해주세요.
- 람다 표현식: 함수형 프로그래밍 패러다임을 지원하기 위해 추가된 기능으로, 코드를 간결하게 작성할 수 있고 병렬처리를 위한 스트림 API와 함께 사용하면 더욱 강력한 기능을 제공합니다.
- 스트림 API: 컬렉션 데이터를 다루는 기능을 강화하고 병렬 처리를 통해 처리 속도를 개선할 수 있는 기능입니다.
- Optional Class: null값을 처리하는 데 사용되는 클래스로 NPE(NullPointerException) 오류를 방지하고 가독성을 높일 수 있습니다.
- 날짜와 시간 API : Joda-Time 라이브러리를 기반으로 한 새로운 API를 제공하여, Date와 Calendar 클래스의 한계를 극복하고 가독성과 유지보수성을 높일 수 있습니다.
- 메서드 참조: 람다 표현식과 함께 사용하여 코드의 가독성을 높일 수 있습니다.
- Java는 Call By Value일까요, Call By Reference 일까요?
- 콜 바이 벨류입니다. 메서드에 전달되는 인자는 값에 의한 전달로 전달되며, 기본 데이터 타입의 경우에는 값을 복사해서 전달하고, 객체의 경우에는 객체의 레퍼런스를 복사해서 전달합니다. 따라서, 메서드 내부에서 인자 값을 변경해도 메서드 호출자에게는 영향을 주지 않습니다.
- Interface와 Abstract Class의 차이는 무엇인가요?
- interface: 추상 메서드와 상수로만 이루어 진 것. 다중 상속이 가능하다. 모든 메서드는 추상 메서드이므로 상속 받은 클래스에서 구현을 강제함.
- Abstract Class: 추상 클래스로 인스턴스를 생성할 수 없으며, 자식 클래스에서 반드시 구현해야 하는 추상 메서드를 가지고 있을 수 있음. 다중 상속이 불가능하지만, 구현된 메서드를 가지고 있을 수 있음.
- 객체 지향 프로그래밍을 왜 사용한다고 생각하시나요?
- 객체 지향 프로그래밍은 코드의 재사용성과 유지보수성, 확장성이 높다는 장점이 있기 때문입니다. 객체 지향 프로그래밍은 데이터와 해당 데이터를 처리하는 메서드들을 하나의 묶음으로 정의하여 객체를 생성하고, 객체 간의 상호작용을 통해 로직을 구현합니다. 이렇게 하면 코드의 재사용성이 높아지며, 객체들이 독릭접으로 존재하기 때문에 유지보수 및 확장성도 높아집니다.
- Array와 ArrayList의 차이점을 무엇인가요?
- Array: 고정 크기의 배열이고, 한 번 생성한 크기를 변경할 수 없습니다. 하지만 빠른 접근 속도를 가지고 있습니다.
- ArrayList: 크기를 변경할 수 있는 동적 배열이며, 데이터의 추가나 삭제가 자유롭고, 배열의 크기를 자동으로 조절할 수 있습니다. 하지만 내부적으로는 배열로 구현되기 때문에 배열보다 느린 접근 속도를 가집니다.