Dev 127

[WEB] 로그인 클라이언트 IP 를 정확하게 알기 (XFF)

문제 인식 기본적으로 HttpServletRequest 를 이용하여 객체 내 함수로 클라이언트 IP를 가져올 수 있다. 기본 클라이언트 IP 를 가져오는 방법은 아래와 같다. import javax.servlet.http.HttpServletRequest; request.getRemoteAddr(); 하지만 이 코드를 실 운영에서 이용할 경우 문제가 있다. 대부분의 회사에서는 보안 관련 방화벽이나 클라우드로 운영하는 경우가 많은데, 이 경우 클라이언트의 원 IP주소를 가져올 수 없다. 클라이언트가 요청을 하면 Web Server에서 프록시나 로드 밸런서를 통해 WAS에 요청하기 때문에 프록시나 로드 밸런서의 IP 주소를 반환하게 된다. 그래서 원 IP를 못가져오는 현상이 발생한다. 해결 아래와 같이 샘플..

Dev 2023.09.01

[비사이드] 비사이드 후기 - 중간 회고

비사이드 11기에 참여하여 어느덧 10주차 개발일지를 작성하게 되었고, 중간 회고를 한번 해볼 필요성을 느껴 중간 회고록을 작성해 보았다. 나에겐 너무 의미있었던 프로젝트였고, 마무리까지 잘 되어서 끝까지 좋은 경험으로 남았으면 하는 마음에 이 포스팅을 작성하게 되었다. 비사이드 시작하게된 동기 내가 처음으로 사이드 프로젝트에 관심을 가졌던 시기는 웹에 어느정도 익숙해지기 시작하면서부터였다. 그 때 당시의 나는 JPA와 Spring Boot에 대해 공부하고 간단히 프로젝트를 만들 수 있을 정도의 실력이 된다고 생각했었는데, 과정이 너무나도 재미있었다. 또한, 빠른 시일 내에 더 멋진 백엔드 개발자가 되는 것이 꿈인 나에게 멋진 포토폴리오를 만들고 싶다는 생각이 들기 시작했을 때이다. 사람은 보고싶은 것만..

Dev/Bside 2022.08.26

[Next Step] 자바 웹프로그래밍 2.3 정리

요구사항 전달하는 문자를 구분자로 분리하자 각 숫자의 합을 구해 반환하자 쉼표(,) 또는 클론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환하 커스텀 구분자를 지정하자 "//", "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용하자 문자열 계산기에 음수를 전달하는 경우 RuntimeException으로 예외처리하자 요구사항을 더 작은 단위로 쪼개보자 개발자의 역량을 키우기에 좋은 연습이다 String 클래스를 활용하자 2.3.2를 보기 전 내가 구현한 테스트 코드 및 구현 코드 알고리즘이랑 유사하다고 느꼈다. 상당히 자세하고 요구사항이 쪼개지며, 예외에 대한 테스트도 꼼꼼히 작성하게 되는 느낌이었다. 음수가 있으면 예외처리를 던지는 로직을 추가하였다. 테..

Dev 2022.08.24

[Next Step] 자바 웹프로그래밍 2.1,2.2 정리

2.1 main() 메소드를 활용한 테스트의 문제점, 2.2 Junit을 활용해 main() 메소드 문제점 극복을 정리해보았습니다. 학습 목표 문제점과 해결방식에 초점을 맞추어 정리했습니다. 문제점이 무엇인지 아는 상태에 도달하기 위해 노력했습니다. 1. 프로덕션 코드와 테스트코드(main()) 이 같은 클래스에 위치하고 있다. public class Calculator{ ... } public static void main(String[] args){ Calculator cal = new Calculator(); cal.add(1,2); cal.sub(1,2); } 프로덕션 코드와 테스트 코드를 분리하자 public class Calculator{ ... } 분리! public static void m..

Dev 2022.08.22

[Spring Boot] Controller에서 매개변수 넘겨받기

controller단에서 매개변수를 넘겨받는 방법을 한번 정리하고 넘어가고 싶어 포스팅을 남기게 되었다. 1. /test/{id} 로 넘겨받고 싶은 경우 - @PathVariable /* /test/{id} */ @GetMapping("/test/{id}") public String testControllerWithPathVariables(@PathVariable(required = false) int id){ return "hello id : " + id; } 2. /test?id=123으로 넘겨받고 싶은 경우 - @RequestParam /* /test/testRequestParam?id=123 */ @GetMapping("/test/testRequestParam") public String test..

Dev/SpringBoot 2022.07.18

Restful 하다는 것은 뭘까?

REST - Representational State Transfer의 약자로, 아키텍쳐 스타일이다. - 아키텍쳐 스타일 : 반복되는 아키텍쳐 디자인 - 아키텍쳐 패턴 : 어떤 반복되는 문제 상황을 해결하는 도구 - 6가지 제약조건으로 구성되며, 이 가이드라인을 따르는 API를 RESTful API라고 한다. REST 제약조건 - 클라이언트-서버 - 상태가 없음 - 캐시되는 데이터 - 일관적인 인터페이스 - 레이어 시스템 - 코드-온-디멘드(Optional) 1. 클라이언트-서버 - 리소스 : REST API가 리턴할 수 있는 모든 것을 의미. 예를들어 HTML, JSON, 이미지 등이 있다. - 리소스를 관리하는 서버가 존재하고, 다수의 클라이언트가 리소스를 소비하려고 네트워크를 통해 서버에 접근하는 ..

Dev 2022.07.18

[Spring] 의존성 주입(DI)에 대해 알아보자 - 3 / 의존성 주입

[Spring] 의존성 주입(DI)에 대해 알아보자 - 1 / 개요, Bean 정의 [Spring] 의존성 주입(DI)에 대해 알아보자 - 2 / Bean 설정 의존성 주입 의존성 주입에는 3가지 방법이 있다. . 설정자 기반 의존성 주입 방법 . 생성자 기반 의존성 주입 방법 . 필드 기반 의존성 주입 방법 설정자 기반 의존성 주입 방법 == 세터 인젝션 . 세터 메서드(setXXXX())를 이용해 의존성을 주입하는 방법이다. . 아래와 같은 클래스가 있다고 하고, userService를 구현해보자. // userService를 구현해보자. public class UserServiceImpl implements UserService{ private UserRepository userRepository;..

Dev 2022.03.03

[Spring] 의존성 주입(DI) 에 대해 알아보자 - 2 / Bean 설정

[Spring] 의존성 주입(DI)에 대해 알아보자 - 1 / 개요, Bean 정의 빈 설정하는 방법 . 이전 글 뒷부분을 살짝 가져왔다. . 위의 클래스 AppConfig처럼 빈을 설정하는 방법에도 3가지가 존재한다. . 빈 설정 방식 3가지는 아래와 같다. . ApplicationContext는 단독 앱에서 스프링 프레임워크를 사용하거나, JUnit으로 만든 테스트 케이스 안에서 스프링 프레임워크를 구동할 때 사용된다. . 웹 앱 사용 시, 확장된 개념인 WebApplicationContext를 이용한다. 자바 기반 설정 방식 방법 설명 생성 방식 자바 기반 설정 방식 . 자바 클래스에 @Configuration 어노테이션을 사용하고, 메서드에 @Bean 어노테이션을 사용해서 빈을 정의한다. . 스프..

Dev 2022.03.02

[Spring] 의존성 주입(DI) 에 대해 알아보자 - 1 / 개요, Bean 정의

의존성 주입(DI)이 필요하게 된 배경 . 앤터프라이즈 애플리케이션 개발 시, 하나의 처리를 수행하기 위해 여러 개의 컴포넌트를 조합해서 개발하는 경우가 일반적이다. . '공통으로 사용되는 기능을 따로 분리한 컴포넌트', 'DB 접근을 위한 컴포넌트', '외부 시스템에 접속하기 위한 컴포넌트' 등이 있다. . 하나의 처리를 구현하기 위해 여러 컴포넌트를 통합할 때 의존성 주입이 필요하다. . 예를 들어, UserService의 Save 기능을 구현하기 위해서는 UserRepository나 PasswordEncoder클래스를 이용해서 구현해야 한다. 클래스 간 결합도가 높다 . 위에서 말했듯 UserServiceImpl 클래스를 개발하는 단계에서는 이미 UserRepository나 PasswordEncod..

Dev 2022.02.28