전체 글

· 언어/JAVA
처음부터 자바는 개발자가 플랫폼을 저수준에서 다 알 필요가 없도록 설계했다. 그래서 고객이 성능이 느리다고 얘기해도 개발자는 내가 할 일은 다 했노라 항변할 수 밖에 없는 상황이 연출되곤 한다고 한다.그러나 성능에 관심 있는 개발자라면 기본적인 JVM 기술 스택의 구조를 이해애야한다. JVM 을 이해하면 더 좋은 소프트웨어를 개발할 수 있고, 성능 이슈를 탐구할 때 필요한 이론적 배겨지식을 갖추게 된다.인터프리팅과 클래스로딩자바 가상머신을 규정한 명세서(VM 스펙이라고함)에 따르면 jvm은 스택 기반의 해석 머신이다. 레지스터는 없지만 일부 결과를 실행스택에 보관하며, 이 스택의 맨 위에 쌓인 값(들)을 가져와 계산한다.JVM 인터프리터의 기본 로직은 평가 스택을 이용해 중간 값들을 담아두고 가장 마지막..
· 언어/JAVA
먼저 "자바 최적화" 라는 책을 읽게 된 계기는 난 자바 백엔드 개발자라고 소개하지만, "자바" 언어 자체에 그렇게 딥하게 공부한 적이 없는 거 같다는 생각이 들었고, 프레임워크에 의존하지 않고, 언어 자체만으로 최적화를 해보고 싶었다. 들어가며JIT와 GC 성능이 향상되면서 작은 메서드를 적절히 인라이닝하고 인터페이스 및 타입 체크는 저렴하게 처리하면서 JIT컴파일러가 만든 네이티브 코드는 간결하고 효율적으로 유지하는, "좋은" 코딩 패턴을 따를게 맞습니다.그러나 경우에 따라 사람이 직접 코드를 작성하고 컴파일러 및 CPU 한계를 감안해 추상화 아키텍처를 재조정하애할 때도 있습니다.모든 성능 문제는 한가지 정답이 있는게 아니라 여러개 정답이 있고 그 중 요건에 가장 알맞은 해결책을 조합하는 게 기술이다..
· 언어/JAVA
CompletableFuture란?java5부터 비동기 연산을 위해 추가된 Future 인터페이스의 문제를 보완해서 java8에 나온 구현한 클래스CompletableFuture를 사용하기 전에 Future의 어떤 문제점을 보완했는지 살펴보자Future의 문제점여러 연산을 결합하기 어려운 문제비동기 처리 중에 발생하는 예외를 처리하기 어려운 문제CompletableFuture 개선 사항Future 인터페이스와 *CompleteStage 인터페이스를 구현하여 하고 있다.*CompleteStage: 여러 연산을 결합할 수 있도록 연산이 완료되면 다음 작업을 수행, 값을 연산하는 비동기식 연산 단계를 제공하는 인터페이스따라서 CompletableFuture는 여러 연산을 결합한 비동기 연산 처리, 예외 처리 ..
문제 상황AWS 프리티어를 사용하기 위해 t2.micro 인스턴스를 사용해서 배포를 하고 있었다. 빠른 배포와 편의성을 위해 도커로 mysql과 redis, spring boot 컨테이너 2개를 띄우는데 자꾸 서버가 죽고 자꾸 연결성 실패가 떠서 서버에 접속할 수도 없었다.과제인스턴스를 재시작하면 연결성을 통과되는데 컨테이너가 자꾸 죽는게 문제였다. 이전 프로젝트에서도 매번 서버가 죽는 경우가 다분했는데, 이럴 때마다 그냥 인스턴스 재시작후 컨테이너를 다시 띄어주었다.이번에는 컨테이너를 띄울 때마다 서버가 죽는 근본적인 원인을 알아보고, 이를 해결해보기로 했다.문제 해결 과정원인 파악을 위해 아래 과정을 거쳤다.EC2 시스템 로그 확인하기시스템 로그에서 원인 분석하기원인 분석 후 해결하기EC2 시스템 로..
OOM.. 서비스 로직에서 만나보고 싶었던 녀석.... 드디어 만났다.OOM, 왜 발생했는가?결론부터 말하면 100만개의 row로 부하테스트를 진행하다가 만났다.교보 DTS 기업 협업으로 진행한 백오피스 프로젝트에서 각 기능마다 엑셀다운로드 하는 기능이 있었고, 해당 코드를 개선만했고, 부하 테스트는 진행해보지 않았었다. 이번 기회에 코드 리팩토링과 부하테스트를 진행보다가 100만개의 엑셀 row를 작성하면 기존 코드에서 OOM이 발생하는 상황을 마주했다. (기존코드에서 어떻게 리팩토링하고 성능 개선했는지는 추후에 작성 예정이다.)해결하기 위한 과제메모리 초과를 해결하는 게 과제이다. OOM을 보고 제일 먼저 떠오른게 GC 튜닝 이라는 단어였다. JVM 의 메모리가 꽉 차서 메모리 부족현상이 뜬 것일테..
· ETC
급한 성격상 일단 코드부터 두둘기면서 개발을 시작했는데, 이게 개발에 정말 안좋은 습관이란 걸 깨달았다..이런 생각을 들게 해준 발단카카오 developer 문서 보면서 OAuth 로그아웃을 구현하는데 문서보면서 무작정 따라 했다.문제가 문서를 제대로 안보고 따라해서 계속 오류를 마주침..... 예를 들어서 쿼리 파라미터로 들어가야하는 값이 body로 들어가서 계속 잘못된 요청이라고 떳다. 이걸 해결 못해서 1시간 동안 삽질했다. 회고해보면 내가 이렇게 해서 허비한 시간만 합쳐도 1년도 넘을 것 같다. 대학교 1학년부터 지금까지 개발할 때 이런식으로 했으니까...깨달은 점개발하기 전에 어떻게 개발할지 흐름이라도 작성하자.나무를 보지말고 숲을 보라는 말이 있듯이 개발도 똑같이 적용된다고 생각한다... 코..
문제 상황public class OAuth2LoginSecurityConfig { private final UserRepository userRepository; private final OAuthService oAuthService; //-> 여기서 ...}@Servicepublic interface OAuthService {} //GoogleOAuthService, KakaoOAuthService가 구현 오류 발생Parameter 1 of constructor in com.memo.login.oauth.CustomOAuthService required a bean of type 'com.memo.login.oauth.OAuthService' that could not be found.인터..
이전 포스팅에서 Spring Security 를 활용하지 않고 컨트롤러로 다 구현했다.이번에는 왜 Spring Security를 사용해서 OAuth를 구현해야하는지를 고려해보려고 한다.Spring Security?스프링 시큐리티는 강력하고 고도로 사용자 지정 가능한 인증 및 액세스 제어 프레임워크입니다. 스프링 기반 애플리케이션을 보호하기 위한 사실상의 표준입니다.스프링 시큐리티는 Java 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크입니다. 모든 스프링 프로젝트와 마찬가지로 스프링 시큐리티의 진정한 힘은 사용자 지정 요구 사항을 충족하기 위해 얼마나 쉽게 확장할 수 있는지에 달려 있습니다 스프링을 사용할 때 보안을 적용하고 싶다? 그럼 Spring Security를 사용해라...
OAuth(Open Authorization)OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹 사이트 상의 자신들의 정보에 대한 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준다. 구글에 로그인하면 API를 통해 연동된 계정의 Google Calender 정보를 가져와 사용자에게 보여줄 수 있다.이때 사용되는 프로토콜이 OAuth다. 더 잘 이해하기 위해 인증과 인가에 대한 개념을 구분해보자Authentication(인증): 유저 본인을 확인하는 과정(로그인)Authorization(인가): 인증 후 인가를 진행, 인가에 따라 유저 정보를 선택전으로 반환한다파티에 초대된 손님을 예로 들어보면,호스트가 파티에 입장하는 사람의..
hapBday
개발자로 성장하기 위한 기록들