1. WAS와 WS의 차이를 설명하세요
WAS : 비즈니스 로직을 넣을 수 있음
- Tomcat, PHP, .NET
WS :비즈니스 로직을 넣을 수 없음
- Nginx, Apache
2. Spring Framework에 대해 설명해주세요
자바 개발을 최대한 POJO방식으로 개발 할 수 있도록 도와주는 프레임워크
- IoC (제어의 역전) 결합도를 낮춤 : 컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링이 호출하는 방식
- DI (의존성 주입) :각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 연결시켜줌
- AOP (관점 지향 프로그래밍) : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
3. Spring Framework와 Spring boot의 차이를 설명해주세요
Spring은 프로젝트 초기에 다양한 환경설정을 해야한다는 문제, 웹서버를 배포해야한다는 번거로움도 존재
-> boot는 설정의 많은 부분(호환성까지) 자동화하여 사용자가 편리하게 스프링을 활용할 수 있도록 도와줌
-> 내장 톰캣을 제공하여 서버를 바로 실행할 수 있음
4. Spring MVC에 대해서 설명해주세요
각 레이어간 기능을 구분하는데 중점을 둔 디자인 패턴
Model : 데이터 관리 및 비즈니스 로직을 처리하는 부분 (DAO, DTO, Service)
View : 비즈니스 로직의 처리 결과를 유저 인터페이스로 표현하는 부분
-> html, jsp, tymeleaf등으로 화면을 구성하기도 하고, Rest API로 서버가 구현된다면 json 응답을로 구성되기도 한다.
Controller는 사용자의 요청을 처리하고 Model과 View를 중개하는 역할을 한다. Model과 View는 서로 연결되어있지 않기 때문에 Controller가 사이에서 통신 매체가 되어준다.
5. IoC에 대해서 설명해주세요
모든 객체에 대한(생성, 라이프사이클 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 말함.
스프링에서는 IoC 컨테이너에 객체들을 생성(bean 이라고 함) 하면 객체끼리 의존성을 주입(DI)하는 역할을 함
->개발자가 더욱 비즈니스 로직에 집중할 수 있도록 함
6. 스프링 빈을 등록하는 방법에 대해 말해보세요
두가지 방법이 있습니다.
1. @Component 어노테이션을 사용하는것
@Controller, @Service, @Repository 모두 @Component를 포함하고 있음
2. 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고,
해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됨
7. 의존성 주입(DI)에 대해서 설명해주세요
필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 객체를 받아서 사용하는 것
-> 객체의 결합도를 줄이고 코드의 재사용성을 높일 수 있다.
3가지 방법
- 생성자 주입, 필드 주입, 세터주입 -> public으로 해야하는데, 개방 폐쇄원칙 위반
생성자 주입을 가장 권장함
-> 1. 순환 참조 방지, 2. 불변성을 가짐, 3. 테스트에 용이
8. Filter와 Interceptor, AOP에 대해서 설명해주세요.
client - Filter - Dispatcher Servlet - Interceptor - AOP- Controller
여기서 알 수 있는 점: Filter - Servlet Container에 의해 관리가 된다면, Interceptor는 Spring Context에 의해 관리가 됨
Filter - 주로 스프링과 무관한 전역적인 요청을 처리
- 공통된 보안 및 인증/인가 작업
- 이미지/데이터 압축, 문자열 인코딩
- Spring과 분리되어야 하는 기능
- 모든 요청과 응답에 대한 로깅
근데 요즘엔 스프링 빈으로 등록이 가능함.
Interceptor - Filter와 다르게 스프링의 모든 Bean 객체에 접근할 수 있다. 그래서 Filter와 다르게 트랜잭션과 관련된 처리도 진행할 수 있다.
- 세부적인 보안 및 인증/인가 작업
- API호출에 대한 로깅 또는 검증
- Controller로 넘겨주는 정보의 가공
AOP - 로직을 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하는 프로그래밍 패러다임
- 이걸로 로그와 에러처리를 구현한적 있음
9. Scale-Up과 Scale-Out의 차이를 설명해주세요.
Scale-Up - 기존 서버의 사양(CPU, RAM)을 업그레이드 해 시스템을 확장 (수직적 확장)
Scale-Out - 서버를 여러 대 추가하여 시스템을 확장하는 것 (수평적 확장) 이때 서버가 여러 대로 나뉘기 때문에 각 서버에 부하를 균등하게 해주는 '로드 밸런싱'이 필수적으로 동반되어야함
10. JPA N+1문제가 발생하는 이유와 해결하는 방법
1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미
해결법엔 여러 방법이 있지만 가장 많이 사용되는 방법은 Fetch Join을 사용해 해결하는 방법.
발생 이유: 연관관계를 가진 Entity를 조회할 땐 한 쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문.
Fetch Join을 사용하면 미리 두 테이블을 Join하여 한 번에 모든 데이터를 가져오기 때문에 N+1문제를 막을 수있음.
11. JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?
일단 JPA 자체는 정적인 상황에서 사용하는 것을 권장하기 때문에 복잡한 쿼리와 동적인 쿼리에 대한 문제가 발생하게 되는데,
그럴때는 JPQL과 QueryDSL을 사용할 것을 권장하고 있습니다.
12. MyBatis에 대해서 설명해주세요.
SQL Mapper라는 기술인데, 개발자는 SQL만 작성해주면 해당 SQL의 결과를 객체로 편리하게 매핑해준다.
JDBC를 직접 사용할 때 발생하는 여러가지 중복을 제거해주고, 기타 개발자에게 여러가지 편리한 기능을 제공
JDBC Template를 사용할 땐 동적SQL을 처리하기 어렵지만 MyBatis는 동적 SQL을 처리하기 편하게 해준다.
또 SQL을 자바 코드로 작성하기 때문에 SQL 라인이 코드를 넘어갈 때 마다 더하기 문자를 해주어야 한다는 단점도 있다.
특히, SQL을 XML에 편리하게 작성할 수 있고, 동적 쿼리를 매우 편리하게 작성할 수 있다.
where과 if같은 태그들이 존재하기 때문에 동적쿼리를 매우 편리하게 작성 가능
근데 DBMS가 바뀐다고 했을 때 각DBMS마다 Dialect가 있는데 이에 따라 SQL을 전부 바꿔줘야한다는 문제가 있다. 아직 기술에 종속적이라는 문제가 있다.
List<Item> findAll(ItemSearchCond itemSearch);
<select id="findAll" resultType="Item">
select id, item_name, price, quantity
from item
<where>
<if test="itemName != null and itemName != ''">
and item_name like concat('%',#{itemName},'%')
</if>
<if test="maxPrice != null">
and price <= #{maxPrice}
</if>
</where>
</select>
Mybatis는 where, if와 같은 동적 쿼리 문법을 통해 편리한 동적 쿼리를 지원
<if>는 해당 조건이 만족하면 구문을 추가한다.
<where>는 적절하게 where문장을 만들어준다.
- 예제에서 <if>가 모두 실패하게 되면 SQL 'where'를 만들지 않는다.
- 예제에서 <if>가 하나라도 성공하면 'and'를 'where'로 변환해준다.
#유의#
XML 특수문자
<= 라고 하지않고 '<='를 사용한 것을 확인할 수 있는데, XML에서는 데이터 영역에 >나 <와 같은 특수문자를 사용할 수 없다.
because, XML에서 TAG가 시작하거나 종료할 때 <와 >를 사용하기 때문.
< : <
> : >
& : &
13. Authentication vs Authorization
인증 : 사용자가 누구인지 확인, 로그인, 아이디/비번, OAuth, JWT
인가 : 사용자가 무엇을 할 수 있는지, 인증 후 특정 자원 접근 시 수행, 역할 및 권한
'📖Computer Science' 카테고리의 다른 글
| 프록시와 리버스 프록시 (0) | 2025.03.07 |
|---|---|
| [프로그래밍 공통] 기술면접 (0) | 2025.01.03 |
| [네트워크] 기술면접 (1) | 2025.01.02 |
| [DB] 기술면접 (0) | 2025.01.01 |
| [Java] 기술면접 (1) | 2025.01.01 |