Java 28

[Distance] API 요청 과부하로부터 서비스를 보호하자.

Distance서비스를 운영하면서 사실 마냥 순탄치는 않았습니다.서비스를 운영하면서 겪었던 문제 중 하나인 "Postman을 통한 무한 API요청"을 효과적으로 차단한 경험을 공유하려 합니다. 저희 서비스는 축제 시즌에 배포된 서비스인데 00대학교에 배포 중 갑자기 오후 11시쯤에 Slack으로 알림하나가 날라왔습니다.이 에러는 저희 서비스에 굉장한 크리티컬한 에러였습니다.사용자가 Distance서비스에 신규 가입을 하려면 반드시 SMS인증을 통해 가입을 할 수 있는데 그 인증 API가 일일 사용량 초과가 된 것입니다.분명 일일 한도가 약 390건 정도가 남아있었는데 이게 한 순간에 사라진게 이상하게 생각해 발송내역을 보니 한 번호가 391건의 요청을 했던 것을 확인할 수 있었습니다. 알고보니 Postm..

Project/Distance 2025.03.11

[Distance] 나의 첫 서버 트래픽 경험기

구름톤에서 시작한 Distance프로젝트는 어느덧 순천향대, 경희대, 동국대, 서울여대, 한국외대를 지나 저희 팀의 리더분 학교인 전남대에도 배포를 하게 되었다. 저희가 이 프로젝트를 구현하고 순천향대에 첫 배포를 할 때 목표가 "서버를 터트릴때까지 해보자!" 였다.사실 ec2유형이 t2.micro여도 지금까진 단 한번도 서버가 터지지 않고 사용률이 70%이상만 가보기만 했다. 그리고 나름 채팅이 MVP이다보니 I/O가 많을 거 같아 미리 분산을 시켜두면서 나름 준비를 많이 해두었다.지금 현재 저는 판교에 있는 회사 인턴으로 하고 있는 중 2024/09/12에 전남대 단과대 축제에 맞춰 distance서비스를 배포를 하였다.오랜만에 배포라서 귀하디귀한(?) 점심시간도 자진 반납을 하고 서버 모니터링을 하..

Project/Distance 2024.09.18

[Trouble Shooting] Refresh Token 구현

이번 포스팅에서는 디스턴스 로그인 구현 중 사용자의 불편함을 덜기 위해 Refresh Token을 구현하면서 겪었던 문제에 대해 이야기를 해보겠습니다. 저는 다른 프로젝트에서는 JWT의 Access Token만을 사용해서 로그인 기능을 구현하였습니다.물론 토큰의 만료시간은 하루(24시간)으로 두고  하였습니다. 물론 그 전의 프로젝트의 실제 유저 유입이 많이 없어서 이런 부분을 크게 신경쓰지 안하고 안일하게 생각을 했었습니다..하지만 이번 디스턴스 프로젝트는 유저 유입이 많을거라고 생각하기도 했고, Access Token의 유효기간을 너무 오래잡으면 좋지 않다는 것을 알게 되었습니다.제가 생각한 단점은Token이 탈취당하면 막을 방법이 없다.그럼 유효기간을 짧게 잡아서 Token을 자주 변경한다.그럼 사..

Project/Distance 2024.06.22

[JAVA] 동시성 & Thread

프로젝트를 진행 중 좋아요를 누르는 API가 있는데 문득 동시에 여러사람이 동시에 하나의 게시글에 좋아료를 눌렀을 때 어떻게 될까?라는 의문을 가지게 되었다.. 현재 코드에서는 만약 2명의 유저가 하나의 게시글에 좋아요를 동시에 눌렀을 때 좋아요 갯수가 하나만 올라간다...! 😪 물론 좋아요갯수가 중요도가 높은 API는 아니긴 하지만 동시성에 관심을 갖고 한번 해결해보고 싶었다. 우선 동시성을 하기 전에 Thread개념에 대해 알아야한다. https://wnstjr120422.tistory.com/entry/JAVA-Thread-Runnable-Multi-Thread%EB%9E%80 [JAVA] Thread & Runnable & Multi Thread란? Thread(스레드)란? 프로세스 내에서 실행되..

JAVA 2024.03.03

JAVA_단위 테스트&통합 테스트

모든 개발자들은 프로젝트를 할 때 테스트는 반드시 필요한 필수조건이다. 테스트종류에는 위의 사진과 같이 (아래서부터)단위 테스트, 서비스 테스트, 사용자 인터페이스 테스트 총 3가지가 있다. Unit Tests(단위 테스트) 작은 컴포넌트, 하나의 기능을 하는 함수처럼 잘개 쪼개어 테스트 하는 방식 @Test public void 게시글_저장_불러오기(){ //given String title="테스트 게시글"; String content="테스트 본문"; postsRepository.save(Posts.builder() .title(title) .content(content) .author("junseck") .build()); //when List postsList=postsRepository.fin..

JAVA 2023.10.16

[Spring] 스프링 시큐리티(Security)

더보기 스프링 시큐리티(Security)란? 스프링(Spring) 기반의 웹애플리케이션의 인증(Authenticate)과 권한(Authorize)을 담당하는 스프링의 하위 프레임 워크 그럼 스프링 시큐리티의 작동 원리는 어떻게 될까? 그 전에 우선 스프링의 작동원리를 알아보자. 사용자로부터 web.xml을 통해 요청이 들어온다. 보통은 localhost:8080을 통해 사용자와 스프링서버와 연결을 한다. Dispatcher Servlet은 8080포트를 통해 들어온 요청을 받아 IoC컨테이너안에 있는 스프링 빈을 검사하여 함수를 제공한다. Controller라고 사용자의 요청을 url을 통해 받아서 Service에게 요청처리를 부탁한다. 사용자의 요청을 받은 서비스는 Repository라고 하는 DB와 ..

SpringBoot 2023.07.24

[Spring] 트랜잭션(Transaction) 이란?

트랜잭션(Transaction)이란? 여러 작업을 진행하다가 문제가 발생한 경우 문제가 발생하기 전의 상태로 롤백(RollBack)하기 위해 사용되는 것이다. 다른 말로 더 이상 쪼갤 수 없는 최소 작업 단위를 의미 트랜잭션의 작업에는 크게 2가지가 있다. 커밋(Commit) -> 작업이 마무리 된 것을 의미 롤백(RollBack) -> 작업을 진행 중 문제가 발생하여 작업중이던 작업을 취소하고 이전의 상태로 되돌리는 것을 의미 Spring에서는 트랜잭션과 관련해서 몇 가지 기술을 제공하고 있다. 트랜잭션 동기화 트랜잭션 추상화 AOP를 이용한 트랜잭션 분리(선언적 트랜잭션) 트랜잭션 동기화 개발자가 여러개의 작업을 하나의 트랜잭션으로 관리하려면 Connection객체를 공유해야하는 불필요한 작업이 생긴..

SpringBoot 2023.07.02

[OOP] 스프링 삼각형(IoC/DI)

스프링을 이해하기 위해서는 스프링 삼각형이 대단히 중요하다. 프로그래밍에서의 의존성이 의미하는 것은 무엇일까? 대답은 전체가 부분에 의존한다는 것을 의미한다. 자바에서는 new키워드가 의존관계를 표현한다고도 한다. 의존성을 주입하는 방법에는 스프링을 이용한 방법과 이용하지 않은 방법 2가지가 존재한다. 우선 스프링을 사용하지 않고 의존성을 주입하는 방법에 대해 설명하겠다. 스프링을 사용하지 않고 의존성을 주입하는 방법(생성자 주입) public class IocDi { public static void main(String[] args) { Case c=new ClearCase(); Phone phone=new Phone(c); System.out.println(phone.getCaseType()); }..

JAVA-SOLID 2023.06.18

[OOP] 디자인 패턴(Singleton, Template Method, Strategy)

Singleton Pattern(싱글톤 패턴) Singleton Pattern은 오직 단 하나만의 인스턴스를 만들고 그것을 계속해서 재사용하는 원칙을 의미한다. 따라서 Singleton Pattern을 적용하면 의미상 한 클래스에 두 개의 객체가 존재할 수 없는 것을 의미한다. Singleton Pattern을 적용하려면 아래와 같은 3가지 조건이 필요하다. new연산을 실행할 수 없도록 생성자에 private접근 제어자를 지정함 유일한 단일 객체를 반환할 수 있는 정적 메소드가 필요함 유일한 단일 객체를 참조할 정적 참조 변수가 필요함 위의 코드를 살펴보면 Singleton클래스의 참조변수를 정적변수로 선언을 하고 초기화를 하지 않았다. 그런 다음 기본생성자를 선언했는데 public이 아닌 privat..

JAVA-SOLID 2023.06.14

[JAVA] I/O스트림

I/O란? Input/Output으로 데이터를 입출력하는 것을 의미 데이터를 전달하는 방법은 다양한데 그 중에서 스트림(Stream), 버퍼(Buffer), 채널(Channel)을 기반으로 하는 I/O가 있다. Stream(스트림) 스트림은 데이터를 전달하는 통로를 의미하는데 단방향으로 밖에 데이터를 전달할 수 없다. 즉, 데이터가 들어온 순서대로 데이터를 출력하는 단방향 통로이다. 또한 데이터를 읽고 쓰기 위해 스트림을 요청하면 스트림은 해당 데이터의 작업을 수행하는 동안 다른 데이터는 스트림에 접근하지 못하고 기다리는 동기화, Blocking방식으로 동작한다. 위처럼 i값을 순서대로 하나씩 출력하는 방식을 stream방식으로 동작한다라고 한다. Buffer(버퍼) Buffer는 데이터를 임시로 한 곳..

JAVA 2023.05.23