Now Loading ...
-
💻[Code Review] WebConfig 클래스 코드 리뷰.
💻[Code Review] WebConfig 클래스 코드 리뷰.
1️⃣ 전체 코드.
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Controller
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 모든 경로 허용
.allowedOriginPatterns("http://localhost:*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true) // 자격 증명 허용
.maxAge(3600);
}
}
위 코드는 Spring Framework에서 CORS(Cross-Origin Resource Sharing) 설정을 정의한 코드입니다.
WebMvcConfigurer 인터페이스를 구현하여 CORS 정책을 구성하고, 클라이언트(예: 프론트엔드)에서 백엔트 API에 요청할 때 발생할 수 있는 CORS 문제를 해결합니다.
2️⃣ CORS란? 🤔
CORS(Cross-Origin Resource Sharing)는 브라우저 보안 정책 중 하나로, 웹 애플리케이션이 자신과 다른 출처(origin)에서 리소스를 요청할 때 이를 허용하거나 제한하는 방식입니다.
예를 들어:
클라이언트가 http://localhost:3000에서 동작하고, 서버가 http://localhost:8080에서 동작하면 두 도메인은 서로 다른 출처로 간주됩니다.
브라우저는 기본적으로 이런 교차 출처 요청을 차단하므로, 서버에서 명시적으로 이를 허용해야 합니다.
3️⃣ 코드 분석.
1️⃣ 클래스 선언.
@Controller
public class WebConfig implements WebMvcConfigurer {...}
WebMvcConfigurer는 Spring MVC 설정을 커스터마이징하기 위한 인터페이스입니다.
WebConfig 클래스는 WebMvcConfigurer를 구현하여 Spring MVC 설정을 사용자 정의하고 있습니다.
2️⃣ addCorsMappings 메서드.
@Override
public void addCorsMappings(CorsRegistry registry) {...}
Spring MVC에서 CORS 매핑을 설정하기 위해 CorsRegistry를 사용합니다.
이 메서드는 클라이언트에서 특정 경로로의 요청을 허용하거나 제한하는 규칙을 정의합니다.
3️⃣ CORS 설정.
registry.addMapping("/**") // 모든 경로 허용
.allowedOriginPatterns("http://localhost:*") // localhost의 모든 포트 허용
.allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드
.allowedHeaders("*") // 모든 헤더 허용
.alloweCredentials(true) // 쿠키와 같은 자격 증명 허용
.maxAge(3600) // 캐시 시간 (초 단위)
addMapping("/**")
모든 URL 패턴(/**)에 대해 CORS 정책을 적용합니다.
예: /api/*, /resources/* 등 모든 경로 허용.
allowedOriginPatterns("http://localhost:*)"
클라이언트가 http://localhost에서 시작되는 모든 포트(예: http://localhost:3000, http://localhost:8080)에 대해 요청을 허용합니다.
Spring Boot 2.4+에서는 allowedOrigin 대신 allowedOriginPatterns 사용을 권장합니다.
allowedMethods("GET", "POST", "PUT", "DELETE")
허용할 HTTP 메서드(GET, POST, PUT, DELETE)를 정의합니다.
예를 들어, OPTIONS와 같은 다른 메서드는 허용되지 않습니다.
allowedHeaders("*")
모든 요청의 헤더를 허용합니다.
예: Content-Type, Authorization 등이 허용됩니다.
allowCredentials(true)
클라이언트에서 쿠키를 사용한 요청을 허용합니다.
예: 인증이 필요한 요청에서 쿠키를 통해 세션 정보를 전달할 수 있습니다.
maxAge(3600)
브라우저가 프리플라이트 요청(OPTIONS 요청)의 결과를 캐싱하는 시간을 정의합니다.
여기서는 3600초(1시간) 동안 캐싱합니다.
4️⃣ 사용 사례.
1. 프론트엔드-백엔드 분리된 환경.
프론트엔드와 백엔드가 서로 다른 출처에서 동작하는 경우:
프론트엔드: http://localhost:3000
백엔드: http:// localhost:8080
이 경우, 브라우저는 기본적으로 교차 출처 요청을 차단하므로 위와 같이 CORS 설정이 필요합니다.
5️⃣ 주의사항.
보안 고려
실제 배포 환경에서는 allowedOriginPatterns에 와일드카드("*")를 사용하는 것을 피하고, 특정 출처만 허용해야 합니다.
예: .allowedOriginPatterns("https://example.com)"
allowCredentials와 *의 충돌
allowCredentials(true)와 allowedOriginPatterns("*")는 함께 사용할 수 없습니다.
쿠키를 사용한 요청을 허용하려면 특정 출처를 명시해야 합니다.
-
💻[Code Review] MySQLConfig 클래스 코드 리뷰.
💻[Code Review] MySQLConfig 클래스 코드 리뷰.
1️⃣ 전체 코드.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class MySQLConfig {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
@Bean(name = "createUserTransactionManager")
public PlatformTransactionManager createUserTranscationManager(DataSource dataSource) {
DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
return manager;
}
}
2️⃣ 코드 리뷰 - 상세하게 뜯어보기 🔍
1️⃣ 클래스 선언부.
@Configuration
@EnableTransactionManagement
public class MySQLConfig {...
@Configuration
이 클래스가 Spring의 설정 클래스임을 나타냅니다.
@Bean 어노테이션이 있는 메서드들을 통해 Bean을 생성 및 등록합니다.
@EnableTransactioonManagement
스프링에서 선언적 트랜잭션 관리를 활성화합니다.
@Transactional 어노테이션을 사용하는 트랜잭션 관리를 지원하도록 설정합니다.
2️⃣ 속성 주입
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value
Spring application.properties 또는 application.yml 파일에 정의된 설정 값을 가져옵니다.
예를 들어, application.properties에 아래와 같은 항목이 정의 되어 있으면:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
이 값들이 url, username, password, driverClassName 필드에 주입됩니다.
3️⃣ 트랜잭션 매니저 생성.
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
이 메서드가 반환하는 객체(DataSourceTransactionManager)를 Spring의 Bean으로 등록합니다.
DataSourceTransactionManager
데이터베이스 트랜잭션을 관리하는 Spring의 기본 트랜잭션 매니저 클래스입니다.
DataSource 객체를 받아서 트랜잭션을 관리합니다.
DataSource는 JDBC를 통해 MySQL 데이터베이스 연결을 제공합니다.
4️⃣ 트랜잭션 템플릿 생성.
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
TransactionTemplate
프로그래밍 방식으로 트랜잭션 관리를 지원하는 템플릿 클래스입니다.
PlatformTransactionManager를 사용하여 트랜잭션의 시작, 커밋, 롤백 등을 관리합니다.
선언적 트랜잭션(@Transaction) 대신 프로그래밍 방식으로 트랜잭션을 제어하고자 할 때 사용됩니다.
5️⃣ 추가적이 트랜잭션 매니저 등록.
@Bean(name = "createUserTransactionManager")
public PlatformTransactionManager createUserTransactionManager(DataSource dataSource) {
DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
return manager;
}
별도의 트랜잭션 매니저 등록
@Bean(name = "createUserTransactionManager")로 지정하여 다른 이름의 트랜잭션 매니저를 등록합니다.
이렇게 하면 여러 데이터베이스 또는 특정 작업에 대해 다른 트랜잭션 매니저를 사용할 수 있습니다.
이 Bean은 필요에 따라 의존성 주입 시 이름으로 참조할 수 있습니다:
@Autowired
@Qualifier("createUserTransactionManager")
private PlatformTransactionManager transactionManager;
3️⃣ 이 코드의 주요 기능.
1️⃣ 데이터베이스 트랜잭션 관리.
데이터베이스 작업 시 트랜잭션(시작, 커밋, 롤백)을 제어합니다.
2️⃣ 선언적 및 프로그래밍적 트랜잭션 지원.
@Transactional로 선언적 트랜잭션을 지원하며, TransactionTemplate을 통해 프로그래밍 방식으로 트랜잭션을 관리할 수 있습니다.
3️⃣ 유연한 트랜잭션 매니저.
하나 이상의 트랜잭션 매니저를 정의하여 다양한 트랜잭션 관리 요구를 충족합니다.
4️⃣ 추가로 알아두면 좋은 점.
1️⃣ 다중 데이터베이스 환경.
두 개 이상의 데이터베이스를 사용하는 경우, 각각의 데이터소스와 트랜잭션 매니저를 별도로 설정하여 관리할 수 있습니다.
2️⃣ DataSource Bean 생성.
이 코드에서는 DataSource가 주입된다고 가정했지만, DataSource를 직접 생성하려면 별도의 Bean 정의가 필요합니다:
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
Touch background to close