스프링부트에서 사용자의 IP 주소를 저장하기 위해서는 다음과 같은 단계를 따를 수 있습니다:
HttpServletRequest 객체를 사용하여 사용자의 IP 주소를 가져옵니다.
스프링부트 컨트롤러 메서드에서 HttpServletRequest 객체를 매개변수로 선언하면 자동으로 주입됩니다.
import javax.servlet.http.HttpServletRequest;
@RestController
public class MyController {
@GetMapping("/api")
public ResponseEntity<String> myApi(HttpServletRequest request) {
String ipAddress = request.getRemoteAddr();
// IP 주소를 사용하여 필요한 작업을 수행합니다.
// ...
return ResponseEntity.ok("API 호출이 완료되었습니다.");
}
}
IP 주소를 데이터베이스에 저장하거나 로그 파일에 기록합니다.
스프링부트에서는 다양한 데이터베이스와 로깅 라이브러리를 사용할 수 있습니다. 여기에서는 예시로 데이터베이스에 저장하는 방법을 보여드리겠습니다.
데이터베이스에 IP 주소를 저장하기 위해 JPA(Java Persistence API)를 사용하는 예시 코드를 작성해보겠습니다.
먼저, 의존성을 추가합니다. build.gradle 파일에 다음 내용을 추가합니다.
dependencies {
// ...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2' // 예시로 H2 데이터베이스를 사용합니다.
// ...
}
그리고 application.properties 파일에 데이터베이스 설정을 추가합니다.
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.h2.console.enabled=true
다음으로, 엔티티 클래스를 생성하여 IP 주소를 저장할 데이터베이스 테이블과 매핑합니다.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class UserIP {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String ipAddress;
// 생성자, getter, setter 등 필요한 메서드 작성
// ...
}
그리고 JPA 리포지토리를 작성합니다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserIPRepository extends JpaRepository<UserIP, Long> {
// 추가적인 쿼리 메서드가 필요하다면 작성 가능
}
마지막으로, 컨트롤러에서 IP 주소를 저장합니다.
import org.springframework.beans.factory.annotation.Autowired;
@RestController
public class MyController {
private final UserIPRepository userIPRepository;
@Autowired
public MyController(UserIPRepository userIPRepository) {
this.userIPRepository = userIPRepository;
}
@GetMapping("/api")
public ResponseEntity<String> myApi(HttpServletRequest request) {
String ipAddress = request.getRemoteAddr();
// IP 주소를 데이터베이스에 저장
UserIP userIP = new UserIP();
userIP.setIpAddress(ipAddress);
userIPRepository.save(userIP);
return ResponseEntity.ok("API 호출이 완료되었습니다.");
}
}
이제 사용자가 "/api" 엔드포인트를 호출할 때마다 해당 사용자의 IP 주소가 데이터베이스에 저장됩니다. 필요에 따라 저장된 IP 주소를 조회하거나 활용할 수 있습니다. 데이터베이스에 대한 설정과 사용하는 데이터베이스 종류에 따라 코드가 다를 수 있으니 참고하시기 바랍니다.
참고로 이런 방식으로 스프링부트에서 사용자 IP 를 수집하거나 request.getRemoteAddr()을 사용하여 사용자의 IP 주소를 가져오는 경우에는 몇 가지 주의할 점이 있습니다. 사용자 IP 주소를 가져오는 방법은 사용하는 프록시 서버의 유무나 네트워크 설정에 따라 다를 수 있기 때문에 정확한 IP 주소를 가져오지 못할 수도 있습니다. 몇 가지 일반적인 상황을 살펴보고, 이러한 경우를 처리하는 방법을 알려드리겠습니다.
프록시 서버를 통해 애플리케이션에 접근하는 경우
프록시 서버를 사용하는 경우, request.getRemoteAddr() 메서드는 프록시 서버의 IP 주소를 반환할 수 있습니다. 사용자의 실제 IP 주소를 얻기 위해서는 "X-Forwarded-For" 헤더를 확인해야 합니다.
스프링부트에서는 @RequestHeader 어노테이션을 사용하여 헤더 값을 직접 읽어올 수 있습니다. 다음과 같이 코드를 수정하여 실제 IP 주소를 얻을 수 있습니다.
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/api")
public ResponseEntity<String> myApi(@RequestHeader(HttpHeaders.X_FORWARDED_FOR) String ipAddress) {
if (ipAddress != null && ipAddress.contains(",")) {
// IP 주소 목록에서 가장 첫 번째 IP 주소를 사용
ipAddress = ipAddress.split(",")[0].trim();
}
// IP 주소를 사용하여 필요한 작업을 수행합니다.
// ...
return ResponseEntity.ok("API 호출이 완료되었습니다.");
}
}
클라이언트와 서버 간에 네트워크 주소 변환이 있는 경우
클라이언트와 서버 사이에 로드 밸런서, 프록시 서버, 네트워크 주소 변환(NAT) 등이 있는 경우, IP 주소가 변환될 수 있습니다.
이 경우, request.getRemoteAddr()를 사용하여 얻은 IP 주소는 변환된 주소일 수 있습니다. 이런 상황에서는 실제 클라이언트의 IP 주소를 가져오기 위해 네트워크 장비나 서버 설정에서 제공하는 헤더나 특별한 속성을 사용해야 합니다.
사용하는 환경에 따라서는 X-Forwarded-For 헤더나 Forwarded 헤더를 확인하여 실제 IP 주소를 가져올 수 있습니다. 스프링부트에서는 위의 예시 코드에서와 같이 @RequestHeader 어노테이션을 사용하여 해당 헤더 값을 읽어올 수 있습니다.
IP 주소를 가져오지 못하는 경우
가끔씩 사용자의 IP 주소를 가져오지 못하는 경우가 발생할 수 있습니다. 이는 클라이언트와 서버 간의 통신이 올바르게 설정되지 않았거나, 네트워크에서 IP 주소를 숨기기 위해 추가적인 보안 조치가 적용되었을 때 발생할 수 있습니다.
이 경우에는 사용자의 IP 주소 대신 다른 정보를 활용할 수 있습니다. 예를 들어, 세션 ID, 사용자 에이전트(User-Agent), 또는 사용자 고유 식별자 등을 활용하여 사용자를 식별하고 기록할 수 있습니다. 이러한 대체 정보는 HttpServletRequest 객체에서 제공되므로 적절한 속성을 선택하여 활용할 수 있습니다.
따라서, IP 주소를 가져오지 못하는 경우에는 위에서 설명한 방법 중 하나를 사용하여 대체 정보를 활용하거나 추가적인 설정을 통해 정확한 IP 주소를 얻을 수 있도록 처리할 수 있습니다.
'IT' 카테고리의 다른 글
@Transactional(readOnly = true) 사용법과 유의사항을 알아보자 (0) | 2023.07.03 |
---|---|
오픈소스 모니터링 도구 Zabbix에 대해 알아보자! (0) | 2023.07.02 |
깃(Git)에서 자주 쓰는 용어 정리 (0) | 2023.07.01 |
스프링부트에서 자주 쓰이는 용어 설명 (0) | 2023.06.30 |
MySQL 데이터베이스의 사용하지 않는 테이블을 정리하는 방법 (0) | 2023.06.29 |