기술면접 준비- Spring
MyBatis
: 자바 퍼시스턴스 프레임워크
: XML이나 어노테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결 시킴
( 퍼시스턴스 : 애플리케이션 종류 후 실행 시 이전에 저장한 데이터를 다시 불러올수 있는 기술)
Spring의 특징
1) 제어 역행(IOC) : 스프링이 사용자 코드를 호출
2) 의존성 주입 (DI) : 느슨한 결합 유지
3) Spring Framework에서 객체 자원을 효율적으로 관리
4) AOP 를 지원
트랜잭션
데이터베이스에서 사용되는 쪼갤 수 없는 업무 처리 단위
(분리해서 실행할 수 없음)
RESTAPI
API :
RESTAPI : 웹상에서 URL을 통해 원하는 정보를 얻어오거나 특정한 요청을 하는 것 (사용 설명서 포함)
JSON
Restful 서비스의 반환 값은 일반적으로 XML과 JSON활용
AJAX
비동기로 통신하는 JavaScript(JSON) & XML
- 데이터를 실어 다른 페이지로 보내는 것이 불가능
- 기존 페이지를 다시 그리지 않아서 실시간으로 값이 변화하는 작업에 유용
동기화
: 요청한 일이 끝날 때까지 다른 일을 하지 못함
비동기화
: 요청해놓고 다른 일을 자유롭게 할 수 있음
Dynamic SQL (동적 쿼리)
상황에 따라 쿼리가 반복되거나 변경되어야 하는 경우 있어서
for문이나 if문 사용이 필요할 때가 있음
빌드
개발한 소스가 실행 가능한 프로그램으로 변환하는 작업
빌드하려면 실제로 동작할 수 있는 WAR 파일 만들고 실제 톰캣에 적용해줘야 함
내장 톰캣과 외장 톰캣 사용
1. War의 외장 톰캣 실행
- 프로젝트가 톰캣 안에서 동작
- 가장 일반적
- 외부 Tomcat Webapp폴더에 파일넣기
2. War 의 내장 톰캣 실행
- 프로젝트가 하나의 자바 프로그램으로 동작
- 솔루션 형태가 아닌 일반 서비스에서 사용하지 않기 (수용한계 적음)
- java -jar [war 파일 경로]의 명령어로 실행
필드 주입 / 생성자 주입
필드 주입 : @Autowired
생성자 주입 :
private final BoardService service; // 생성자 주입
public BoardController(BoardService service) {
this.service = service;
}
생성자 주입을 권고하는이유
: final을 붙일 수 없으므로 불변성을 보장할 수 없음
: 객체 간 순환 참조를 방지할 수 있음
순환 참조
: 하나의 객체와 다른 객체가 서로를 참조하게 되는 현상
: 일반적인 컨트롤러 > 서비스 > DAO 흐름에선 문제 안 생김
: 다만 서비스끼리 참조하는 경우 순환참조 발생 가능
스프링 시큐리티 암호화
: 입력값을 SHA-256 알고리즘을 사용하는 해시함수를 이용하여 암호화
해시 함수
: input 값을 넣으면 어떤 계산에 이해 output을 반환하는 것
이때 output = 해시
해시는 output을 통해 input을 추론할 수 없음-> ' 비가역적 '
📌 AOP(Aspect-Oriented Programming)란?
AOP는 프로그램에서 **공통 기능(예: 로깅, 트랜잭션 관리, 보안 처리 등)**을 비즈니스 로직과 분리하여, 유지보수성과 가독성을 향상시키는 기법입니다.
- 공통 관심사를 **횡단 관심사(Cross-Cutting Concerns)**라고 하며, 애플리케이션 전반에 걸쳐 여러 곳에서 반복적으로 사용되는 기능입니다.
📌 AOP의 주요 개념
1️⃣ Aspect
- 공통적인 기능을 담은 모듈입니다. 예를 들어, 로그를 찍거나 트랜잭션을 관리하는 코드가 들어갑니다.
2️⃣ Join Point
- AOP가 적용될 수 있는 지점을 의미합니다. 메서드 호출 전후, 예외 발생 시 등 특정 시점에 적용 가능합니다.
3️⃣ Advice
- Join Point에서 수행될 코드입니다. 언제 실행될지, 어떤 동작을 할지 정의합니다.
- 예: @Before, @After, @Around 어노테이션을 사용한 코드
4️⃣ Pointcut
- 어떤 Join Point에 Advice를 적용할지를 결정하는 조건식입니다. 특정 메서드에만 적용할 수 있도록 정의합니다.
5️⃣ Weaving
- Aspect를 실제 코드에 적용하는 과정입니다. Spring AOP는 런타임 시 이 과정을 수행합니다.
📌 AOP의 주요 어노테이션
1️⃣ @Before
- 메서드 실행 전에 실행되는 어드바이스입니다.
2️⃣ @After
- 메서드 실행 후에 실행되는 어드바이스입니다. 예외가 발생하든 아니든 실행됩니다.
3️⃣ @Around
- 메서드 실행 전후에 실행됩니다. 가장 강력하고 유연한 어드바이스입니다. 메서드 실행을 수동으로 제어할 수 있습니다.
📌 AOP 예시
1️⃣ 로그를 찍는 Aspect
2️⃣ 트랜잭션을 관리하는 Aspect
📌 AOP의 장점
1️⃣ 공통 기능을 중앙화하여 코드 중복을 줄임
2️⃣ 비즈니스 로직과 공통 기능을 분리하여 코드의 가독성과 유지보수성을 높임
3️⃣ 복잡한 트랜잭션 처리, 로깅, 보안 등을 분리하여 관리 가능
Spring에서 @Autowired 어노테이션은 무엇인가요?
Spring에서 **의존성 주입(Dependency Injection, DI)**을 위한 어노테이션입니다.
이 어노테이션을 통해 Spring IoC 컨테이너에서 관리되는 빈(Bean)을 자동으로 주입받을 수 있음
📌 @RequestMapping, @GetMapping, @PostMapping의 차이점
1️⃣ @RequestMapping
- @RequestMapping은 HTTP 요청의 방식(GET, POST, PUT, DELETE 등)과 관계없이 해당 URL 경로에 대한 처리를 지정할 수 있는 어노테이션
2️⃣ @GetMapping
- **@GetMapping**은 HTTP GET 요청에 대해 매핑을 수행하는 어노테이션입니다.
- 데이터 조회와 관련된 요청에 사용
- URL에 데이터가 노출되기 때문에 보안에 취약
3️⃣ @PostMapping
- **@PostMapping**은 HTTP POST 요청에 대해 매핑을 수행하는 어노테이션입니다.
- POST 방식은 HTTP 요청의 본문(body)에 데이터를 전달
- URL에 데이터가 노출되지 않으므로 보안상 민감한 정보(예: 비밀번호, 회원가입 데이터 등)를 전달할 때 유리
- 데이터 수정, 생성 등의 작업
Spring Security란 무엇이며, 어떻게 사용하나요?
웹 애플리케이션에 대한 인증과 권한 부여를 관리하는 통합 보안 프레임워크
인증 : 사용자의 신원 확인
인가 : 자원에 접근할 수 있는 권한 제어
BCryptPasswordEncoder
@Transactional 어노테이션의 역할
**@Transactional**은 주로 데이터베이스 작업을 수행할 때, 여러 작업을 하나의 트랜잭션으로 묶어 실행할 수 있게 합니다. 트랜잭션은 데이터베이스의 상태를 변경하는 작업들이 **모두 성공하거나, 하나라도 실패하면 모두 롤백(취소)**되는 특성을 가지고 있습니다. -> 데이터 무결성 유지 가능
Spring에서 @Bean과 @Component의 차이점은 무엇인가요?
@Bean과 @Component는 모두 Spring에서 Bean을 등록하기 위한 어노테이션이지만,
사용되는 방식과 등록되는 위치가 다름
@Bean은 메서드 수준
@Component는 클래스 수준 -> 단순히 컴포넌트를 등록하는 역할로 @Service, @Mapper,@Controller
Spring Boot와 Spring Framework의 차이점
Spring Framework : 자바 기반의 엔터프라이즈 애플리케이션을 구축하기 위한 프레임워크
Spring Boot: Spring Framework 위에 구축된 스타터 프로젝트로,
설정을 최소화하고 빠르게 애플리케이션을 실행할 수 있도록 도와주는 도구
Spring에서 @RequestParam, @PathVariable, @RequestBody의 차이점
@RequestParam: URL의 쿼리 파라미터 값을 메서드의 파라미터에 바인딩
@PathVariable: URL 경로에서 변수 값을 메서드 파라미터에 바인딩
@RequestBody: HTTP 요청 본문(body)에 포함된 데이터를 객체에 매핑
기타 질문(정리 중)
String 클래스가 불변(immutable) 클래스인 이유
String 클래스는 불변 클래스로 설계된 이유는 보안, 성능 최적화, 멀티스레드 환경에서의 안전성
- SQL에서 JOIN과 INNER JOIN, LEFT JOIN의 차이점은 무엇인가요?
JOIN: 기본적으로 **INNER JOIN**과 동일합니다. 두 테이블에서 일치하는 값만 반환
INNER JOIN: 두 테이블에서 일치하는 값만 반환하며, 일치하지 않으면 결과에 포함되지 않음
LEFT JOIN: 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블과 일치하는 행이 없으면 NULL 값을 반환
- SQL에서 GROUP BY와 HAVING의 차이점은 무엇인가요?
GROUP BY: 데이터를 특정 컬럼을 기준으로 그룹화
집계 함수(예: SUM(), AVG(), COUNT())를 적용할 수 있음
HAVING: **GROUP BY**로 그룹화된 데이터에 조건을 적용하는 데 사용
- Spring Boot에서의 배포 방법
- 내장 서버 사용: Spring Boot는 내장 서버(Tomcat, Jetty 등)를 제공하므로, WAR 파일을 별도로 생성할 필요 없이 JAR 파일로 실행할 수 있습니다.
- 예: java -jar your-application.jar
- WAR 파일 배포: Spring Boot 애플리케이션을 WAR 형식으로 빌드한 후, 기존의 서블릿 컨테이너(Tomcat, JBoss 등)에 배포할 수도 있습니다.
- Spring Boot 애플리케이션의 pom.xml에 spring-boot-starter-tomcat 의존성을 추가하고 WAR 형식으로 빌드합니다.