이번 글에서는 SSL offloading에 대해 알아보도록 하겠습니다. 1. 상황 (KKK 서비스) A : 저희 이번 신년 기점으로 순간 트랙픽이 튀었었는데. 이부분 관련해서 고민해 보아야 할 게 있어요. B : 트래픽 몰릴 것을 대비해서 서버 수도 미리 증설해두었는데도.. 트래픽을 감당하지 못했네요.. 이 문제를 어떻게 해결하면 좋을까요? A : 서버 갯수의 문제가 아니였던 것 같아요. 트래픽이 몰린 시점을 보면, 각 서버별 CPU 사용량도 그렇게 높지 않았어요. 인프라쪽에 문의해본결과 트래픽이 처음 인입되는 L4의 QPS에 한계가 있는 것 같다는 답변을 받았습니다. 즉.. 맨 앞단에서 클라이언트 트래픽을 받고 있는 L4가 해당 트래픽을 견디지 못하고 있기 때문에 효과가 없었던 것 같습니다. B : 네..
1. 문제 erorr가 올라오는 slack 채널에 이모티콘 🤪 저장이 실패했다는 에러가 종종.. 올라오고 있었습니다. '아니? 현대의 데이터베이스에 이모티콘이 저장이 안될 수 가 있나..?' 라는 생각과 함께 해당 오류가 발생하고 있는 table의 character set을 확인하기위해 다음과 같은 명령어를 입력해보았습니다. SHOW FULL COLUMNS FROM mytable; 그 결과 현재 서비스에서 실 사용중인 table의 character set이 utf8로 설정된 것을 확인할 수 있었습니다. 아.. utf8mb4가 아니라 utf8로 설정이 되어 있었구나.. 그랬구나? 2. 원인 원인은 utf8mb4로 설정되어 있어야 할 character set이 utf8로 설정되어 있었기 때문입니다. 그럼 u..
이번 글에서는 Linux의 Manual에 대해 알아보겠습니다. 1. Manual linux의 manual에는 기본적인 commands 사용법부터 linux system의 전반적인 사용법에 대해 자세히 기록되어 있습니다. linux의 manual은 다음과 같은 구조로 구성되어 있습니다. 1-1) User Commands cal / date / echo 등 모든 유저가 사용할 수 있는 일반적인 commands 들에 대한 메뉴얼이 작성되어 있습니다. 1-2) System Calls linux kernal의 programming function 에 대한 메뉴얼이 작성되어 있습니다. 1-3) C Library Functions c 언어 library 에 대한 메뉴얼이 작성되어 있습니다. 1-4) Devices a..
이번 글에서는 Linux의 Commands에 대해 알아보겠습니다. 1. Commands Commands는 사용자가 termnial에 입력하는 text를 의미합니다. Commands의 특징은 다음과 같습니다. 1-1) Commands는 CommandsName -options inputs 으로 구성되며, case sensitive 합니다. 모든 commands가 -options 과 inputs이 필요한 것은 아닙니다. CommandsName만 입력한 경우 해당 Commands의 default behavior로 동작하게 됩니다. 예를 들어 위와 같이 -A 1 옵션과 12 2020라는 inputs을 cal CommandsName과 함께 사용할 수 도 있지만 단순히 cal 이라는 CommandsName 만 입력해..
1. 문제 amazon ami로 생성한 aws ec2에서 systemd에 custom service를 등록해 사용하려고할때 unrecognized service 에러가 발생할 수 있다. 2. 원인 systemd를 사용하는 버전은 centos7이다. amazon ami는 centos6 버전이기 때문에 systemd가 아닌 이전 버전인 init을 사용해야한다. 3. 해결 aws에서 defualt amazon ami가 아닌 centos7 ami를 사용하자.. 😂 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 nginx web server에 접속했을때 403 error가 발생할 수 있다. 2. 원인 nginx server에서 root에 접근권한이 없어서이다. nginx.conf user centos; events {} http { server { listen 80; server_name 54.180.79.141; root /sites/demo; } } 에러 로그를 확인하면 아래와 같이 permission deny가 발생했다. nginx에서 /sites/demo/index.html에 접근할 수 없다. 3. 해결 접근권한이 막힌 directory에 httpd_sys_rw_content_t 설정을 추가한다. 자세한 내용은 https://www.lesstif.com/pages/viewpage.action?..
1. 문제 nginx 실행시 Failed to start The nginx HTTP and reverse proxy server 에러가 발생할 수 있다. 2. 원인 nginx의 실행 port인 80을 다른 pid가 점유하고 있어서이다. 3. 해결 아래의 명령어로 80port를 소유한 pid를 찾고, kill -15 명령어로 해당 pid를 죽인다 # find netstat -tulpn # kill kill -15 pid 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 JUnit에서 @DataJpaTest를 사용해서 Repository를 테스트하는 경우 아래와 같이 JPAQueryFactory Bean을 찾을 수 없다는 에러가 발생할 수 있다. 2. 원인 @DataJpaTest를 사용하는 경우, 별도의 스프링 bean을 등록하지 않고 Repository만 테스트한다. 따라서 스프링 bean인 JPAQueryFactory를 @Autowired로 선언해 놓았을경우 inject 하지 못해 에러가 발생하게 된다. 변경전 CustomImpl 클래스는 아래와 같다. public class MissionRepositoryCustomImpl extends QuerydslRepositorySupport implements MissionRepositoryCustom { @Au..
1. 문제 JPA를 사용해 객체간 @OneToOne 관계를 설정한뒤 Repository의 save를 호출할때 아래와 같은 에러가 발생할 수 있다. 2. 원인 이러한 상황은 주로 부모객체에서 자식객체를 한번에 저장하려고할때 발생하는 것으로, 자식 객체가 아직 데이터베이스에 저장되지 않았기 떄문이다. 사용한 클래스는 아래와 같다. Mission가 부모 MissionRule가 자식이다. @Getter @NoArgsConstructor @Entity public class Mission extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private Long id; @OneToOn..
1. 문제 intellJ에서 JUnit Test를 수행할때 package 내의 class를 찾지 못해 import 할 수 없는 경우가 있다. 2. 원인 test전에 directory 구조를 변경한 것이 문제였다. 이때 변경전의 class들의 구조가 compile 되어 out directory에 담겨있었다. 3. 해결 IntellJ를 종료 후 다시 재시작하면, IntellJ가 package 구조가 변경된 것을 스스로 감지하고 이전 version의 out directory를 지울 것이냐고 물어본다. 이때 제거한다고 선택하면 에러가 해결된다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 AWS EC2에 S3를 사용하는 srping boot 어플리케이션을 배포할때 에러가 발생할 수 있다. 2. 원인 AWS Client는 배포시 default로 cloudFront를 구성하도록 설정되어 있다. 따라서 CloudFront를 생성하고, application.yml에 명시해주지 않을 경우 에러가 발생하게 된다. 3. 해결 CloudFront를 사용하지 않고싶으면, 간단히 application.yml에 아래의 구문을 추가한다. cloud: aws: stack : auto : false 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 AWS EC2에서 npm을 다운받을 때 아래의 구문을 입력하면 install이 안될 수 있다. sudo yum install npm 2. 원인 음.. 이유는 잘모르겠다. 😅 3. 해결 아래의 구문을 순서대로 입력하면 설치할 수 있다. curl -sL https://rpm.nodesource.com/setup_8.x | sudo -E bash - yum install nodejs --enablerepo=nodesource 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 AWS S3에 React app을 hosting 하는 경우에 404 + NoSuchKey 에러가 발생할 수 있다. 2. 원인 React의 Router가 정상적으로 작동하지 않아서이다. 3. 해결 아래와 같이 Error document에 index.html을 입력하면 해결된다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 A 도메인에서 B도메인으로 cors xmlhttprequest 요청을 보낼때 The 'Access-Control-Allow-Origin' header contains multiple values 에러가 발생할 수 있다. 예를 들어 S3로 호스팅하고 있는 React에서 Nginx+Spring Boot로 구성되어 있는 API 서버로 요청을 보낼때.. 2. 원인 중복된 cors 설정때문이다. Nginx로 proxy server를 구성하고, Spring boot로 application server를 구성했을 경우 Nginx와 Spring boot 두곳에 cors 설정을 하게되면 중복으로 Access-Control-Allow-Origin가 header에 붙게된다. 따라서 multiple ..
1. 문제 ec2 서버에서 git clone 후 ./gradlew로 build로 진행하면 permission denied 에러가 발생한다. ./graldew clean build -x test 2. 원인 ./gradlew를 실행할수 있는 권한이 없어서이다. 3. 해결 build를 수행하려고 했던 동일한 root에서 아래의 명령어로 실행권한을 부여한다. chmod +x ./gradlew 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 ec2 instance에 puttty로 ssh 접속을 하려할때 Server refused our key에러가 발생한다. 2. 원인 login as에 사용자 이름을 제대로 입력하지 않았다. 3. 해결 아래의 내용을 참고해 생성한 AMI Image에 맞는 사용자 이름으로 로그인한다. 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
1. 문제 redis에 cache를 저장하려고 할때 "DefaultSerializer requires a Serializable payload but received an object of type" 에러가 발생한다. 2. 원인 redis는 data를 hash해 저장하기 때문에, redis에 저장할 객체는 serializable를 implements 해야한다. 3. 해결 redis에 저장할 object를 Serializable을 implements 하도록 변경한다. public class CacheObject implements Serializable { .. ... } 추천서적 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 COUPANG www.coupang.com 파트너스 활동을 통해 일정액의 수수..
1. 문제 @SpringBootTest를 사용해 Integeration Test를 수행하려고 할때 Failed to load ApplicationContext 에러가 발생한다. 2. 원인 Test 수행 전 필요한 Bean을 load 하는 과정을 거치는데 이때 applcation.yml 을 제대로 찾지 못했다. 3. 해결 @SpringBootTest에 properties 변수를 사용해 ApplicationContext의 위치를 명시한다. 또한, MockMvcBuilders를 사용해 직접 context와 SpringSecurityFilterChain을 주입한다. UserControllerTest @RunWith(SpringRunner.class) @SpringBootTest(properties = "spri..
1. 문제 Spring Security + OAuth2를 사용해 JWT Token 기반 로그인을 구현한 경우, @WithMockUser를 사용해 Autenticated Rest API에 접근시 TokenAuthenticationFilter에서 error가 발생한다. @WithMockUser(username="USER_NAME") @Test @WithMockUser(username = "USER_NAME") public void user_me_유저정보조회_성공() throws Exception { // given UserPrincipal userPrincipal = UserPrincipal.create(user); // when mvc.perform( get("/user/me") .contentType(M..
1. 문제 @SpringBootTest에서 MockMvc를 사용해 post Rest API를 테스트할때, content로 넘겨준 Json 값이 Object로 convert 되지 않고 null로 넘어온다. 2. 원인 SpringBoot2에서는 @RequestBody를 따로 명시하지 않아도 알아서 object mapping 을 해줘서, 아래의 API는 실제로는 잘 작동한다. POST API @PostMapping("/user/me/update") @PreAuthorize("hasRole('USER')") public Long updateUser(UserUpdateRequestDto requestDto, @CurrentUser UserPrincipal userPrincipal) throws IOExceptio..