hello_world_study의 등록된 링크

키자드에 등록된 총 243개의 포스트를 확인하실 수 있습니다.

Naver Blog

migration springboot 2.x rest api service to 3.x

springboot 2.x 의 rest api 서비스를 springboot 3.x 로 migration 하는 방법에 대해 알아보겠습니다. 동영상으로 좀 더 상세히 설명을 드리고 있으니, 처음에는 동영상으로 학습하고 이후 text 를 통해 재확인하길 추천합니다. https://www.youtube.com/watch?v=oXKTHpjhdHQ&ab_channel=HelloWorld 구체적으로는 아래와 같은 기능들이 springboot 3.x 로 마이그레이션 될 경우 어떤 부분을 수정해야 하는지 알아보도록 하겠습니다. filter interceptor rest controller mybatis jpa swagger 사실 위 기능 외에도 spring security, spring cloud, ... 등을 사용하는 spring boot 서비스를 실무에서 사용하고 있을 텐데, 이런 기능들도 추가적으로 마이그레이션 할 게 있을 수 있습니다. 다만 이번 포스팅에서는 위에서 언급한 가장 기본적인 기능

Naver Blog

BeanFactoryPostProcessor vs BeanPostProcessor

비슷한 이름이라서 항상 헷갈렸는데 정리를 할때가 된것 같습니다. BeanFactoryPostProcessor bean 생성전에 , 정확히는 new 하기 전에 수행됩니다. 즉 아래처럼 수행됩니다. (component scan 등을 통해 )어떤 클래스를 bean 으로 등록해야 할지 알아내기 -> beanFactoryPostProcess 수행 -> bean 등록을 위해 객체 생성 및 bean에 등록 주로 @Value("${xxx}") 와 같은 환경변수를 바인딩 시켜주는 작업등이 beanFactoryPostProcess 를 통해 수행됩니다. BeanPostProcessor bean 등록은 아래처럼 2가지 step 으로 나뉩니다. 객체 생성 생성한 객체를 application context 에 등록 beanPostProcessor 는 1번과 2번 사이에서 주로 수행됩니다. 일반적으로 proxy 객체를 만들고 원본(target) 을 대신하여 proxy 가 bean 으로 등록되도록 해주는 작업에

Naver Blog

spring boot Binder

@ConfigurationProperties 와 같은 어노테이션을 이용하면 환경변수를 class 의 멤버변수로 binding 을 할 수 있습니다. 주로 이걸 사용만 했지 내부적으로 어떻게 동작하는지 모르는 경우가 있는데 Binder 라는 클래스가 핵심 클래스입니다. 아래처럼 get메서드에 환경변수를 넣어주고, bind 메서드에 prefix 및 바인딩할 클래스를 적어주면 바인딩한 객체가 리턴됩니다. 위 코드는 spring 에서 제공하는 cacheCondition 이라는 클래스 내부 코드이며, 이외에도 Binder 를 이용한 소스를 찾아볼 수 있습니다. 중요한건 프로그래밍적으로 바인딩이 필요한 경우 Binder 를 이용해서 할 수 있다는 겁니다.

Naver Blog

템플릿메서드 패턴, 전략 패턴, 템플릿콜백 패턴 , 커맨드 패턴 , 프록시 패턴, 연쇄책임패턴, 퍼사드 패턴 , 데코레이터 패턴 한방에 완성

GoF의 디자인 패턴은 23가지가 있는데 코드 구조는 거의 동일한데 보는 관점에 따라 A 디자인 패턴, B 디자인 패턴 ,... 식으로 이름이 다른 경우가 많습니다. 따라서 이번 포스팅에서는 유사 개념/패턴을 통합해서 알아보겠습니다. 이번 포스팅을 통해 #템플릿메서드 패턴, #전략 패턴, #템플릿콜백 패턴 , #커맨드 패턴 , #프록시 패턴, #연쇄책임패턴, #퍼사드 패턴 , #데코레이터 패턴 에 대해 모두 알아보겠습니다. 가장 중요한 부분 이번에 다룰 디자인 패턴들의 핵심은 변하는 부분과 변하지 않는 부분을 분리하여, 추후 새로운 기능들이 더 추가되더라도 기존 코드를 최대한 수정하지 않는 방법에 관한 것들입니다. java 에서 어떤식으로 구현하면 유지보수가 쉬운 코드가 되는지 알아봅시다. 개념과 java 코드 구현 방법을 다뤄야 하므로 단순 텍스트보다는 영상으로 설명하는게 효과적이어서 각 패턴별로 영상이 있으며, A 디자인패턴으로 구현한 코드에서 어딘가를 변경해서 B 디자인 패턴으

Naver Blog

spring boot actuator 인프런 강의 업로드

spring boot actuator 에 대해 포스팅 및 동영상 강의를 제작하였으며, 아래 링크를 통해 접근할 수 있습니다. https://semtul79.tistory.com/category/spring%20boot/actuator%20in%20spring%20boot 'spring boot/actuator in spring boot' 카테고리의 글 목록 semtul79.tistory.com https://www.inflearn.com/course/spring-boot-actuator-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0 [무료] spring boot actuator 파헤치기 - 인프런 | 강의 spring boot actuator 기본 설정/사용법 및 나만의 custom endpoint와 metrics를 만들 수 있는 방법을 배우게 됩니다. 사용법만 익히는 게 아닌 내부 코드 및 spring boot 기본 지식도 함께 다루어 조금 더 깊이 있는 이해를

Naver Blog

이케아 옷장, 선반 셀프 조립

#이케아 광명점에서 옷장 2개와 식물용 선반 1개를 구입했고 셀프 조립한 후기입니다. 식물용 선반 #빗셰 라는 선반이며 가격은 13만원 정도 합니다. 모든 조립 설명서에는 그림만 있고 영어조차 없습니다. 선반은 구조가 간단해서 그림만으로도 충분했습니다. 높이가 2m 정도 되는 선반이라서 승용차에는 실을수가 없어서 배송 서비스를 신청했습니다. 셀프 조립시 십자 드라이버 정도만 있으면 되고 성인 남자 혼자서 1시간 정도 하면 완성됩니다. 옷장1 - MUSKEN / 무스켄 무스켄 이라는 이름의 옷장인데, 크기가 커서 눕혔다 뒤집었다 하는 작업을 할 때 성인 2명은 반드시 필요합니다. 나사 조이는 작업이 많아서 가급적 전동 드라이버를 이용하길 추천합니다. 안그러면 손에 물집이 잡힐수 있습니다. 조립시 성인 남자 혼자 4시간 정도 걸렸습니다. 좁은 방에서 큰 옷장을 조립하다 보니 공간의 제약으로 빠르게 작업하기 어려운점도 있었으나 셀프 조립 거의 해보지 않은 성인이라면 최소 3시간은 걸릴것으

Naver Blog

산정호수 억새꽃축제 명성산 등산 억새바람길 산정리조트

산정호수 명성산 억새꽃축제는 10월 중순부터 시작합니다. 저희 가족은 이런것도 모르고 산정호수 왔다가 억새꽃 축제가 다가왔길래 급하게 명성산 등산하고 억새꽃 군락지에 미리 가봤습니다. 1박2일 이라서 상동주차장 인근의 "산정리조트" 의 사랑채(복층) 에서 머물렀으며 스파가 있어서 저녁에 뜨끈뜨끈하게 보낼수 있었습니다. 이름에 리조트가 들어가 있으나 펜션입니다 :) https://naver.me/5girN7Ys 산정리조트 : 네이버 방문자리뷰 202 · 블로그리뷰 11 naver.me 하루 자고나서 10시부터 등산을 시작했으며 초등학생딸 포함하여 등산하니 2시간 만에 억새꽃 군락지에 도착했습니다. 일반 성인은 1시간 30분만에 올라갈듯 합니다. 30분간 쉬고 하산하였고 하산은 1시간 30분 걸렸습니다. ( 상동주차장까지) 10월 9일 한글날 등산을 갔는데 사람이 꽤 있었고, 상동 주차장은 오전에 승용차쪽은 만차가 되었습니다. 등산코스는 초보자가 가기 쉬운 1코스를 선택했는데, 일반적인

Naver Blog

remind java. Object 클래스

Object 클래스는 모든 클래스의 최상위 부모 클래스라는건 모두 알고 있을겁니다. 최상위 부모 클래스이므로 Object 클래스에서 제공하는 메서드들은 모든 클래스들의 멤버 함수가 됩니다. 따라서 Object 클래스에서 제공하는 메서드들의 기능이 어떤게 있는지 정확히 알아둘 필요가 있습니다. equals() 아래처럼 == 비교를 수행합니다. 즉 매개변수로 받은 객체와 현재 객체의 메모리 주소가 동일한지를 equals 결과로 반환합니다. public boolean equals(Object obj) { return (this == obj); } 그러나 String과 같은 클래스들은 메모리 주소가 아닌 실제 값이 동일한지를 비교해서 equals 결과를 반환합니다. 아래는 String 클래스의 equals() 메서드의 실제 코드입니다. public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anO

Naver Blog

리팩토링. 의도와 구현 분리하기. 함수 추출

너무 긴 코드는 가독성이 좋지 않기에 몇개의 함수로 분리하는게 좋습니다. 함수 분리의 기준과 함수명을 어떻게 지으면 좋을지에 대해 알아보겠습니다. 보통 함수내의 코드가 길어지면 아래처럼 기능단위로 주석을 적어주는 경우가 많습니다. void test() { // A 수행 ... // B 수행 ... // C 수행 ... } 이렇게 기능단위 혹은 비지니스 로직 단위로 한곳에 몰아 넣었다면, 각 코드 블럭을 별로 메서드로 추출하면 됩니다. 즉 아래처럼 의도 단위로 메서드를 분리하면 됩니다. 메서드명은 해당 메서드에 javadoc 으로 설명을 적는다고 했을때 적을 내용을 메스드명으로 적으면 됩니다. void test() { login(); collectUser(); saveHistory(); } login() {} collectUser() {} saveHistory() {} 즉 "사용자 로그인 이력을 저장" 이라고 주석을 적어야 겠다면, 주석을 적지 말고 메서드명을 saveUserLogin

Naver Blog

Executors, thread pool, CountDownLatch

여러 쓰레드를 동시에 구동하고 모두 완료될때 까지 기다리는 작업을 해야 할 경우가 자주 있습니다. 즉, 5개 rest api 를 병렬로 호출하고, 응답이 모두 올때까지 기다린 후 모든 응답이 왔을 때 , 다음 로직을 수행하고 싶을때가 많습니다. 이 경우 java 의 #executors 를 이용한 thread pool 을 생성하고, 모든 작업이 완료되었는지를 확인하기 위한 용도로 #CountDownLatch 를 쓰면 좋습니다. 아래 코드를 보면 쉽게 이해가 가능합니다. import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Slf4j public class ThreadTest { @Test void test() throws InterruptedException { int totalEvent = 15; int th

Naver Blog

리팩토링. 긴 함수

반복문안에 여러 로직을 모두 넣으면 성능적으로 가장 최적화된 코드가 나올 수 있습니다. 그러나 그만큼 가독성이 떨어집니다. 성능 문제가 없는 것이라면 각각의 함수로 쪼개도록 합니다. 이 경우 for loop를 1번만 수행하면 될일을, 여러 함수로 쪼개다보니 각 함수에서 for loop 를 수행하므로 for loop 가 2번, 3번, ... 식으로 늘어날 수 있습니다. 그러나 그렇더라도 시간복잡도는 O(n) 으로 동일합니다. 즉 기존에 10ms 걸리던 것이면, 20ms, 30ms 정도 더 늘어나는것이지, 10ms -> 100ms, 1000ms 처럼 늘어나는게 아닙니다. 따라서 큰 데이터가 아니고 성능에 문제없는 로직이라면 성능을 일부 포기하고 여러 함수로 쪼개서 가독성과 모듈화를 더 좋게 하도록 하는게 좋습니다. 여러 메서드에서 자주 사용되는 변수가 있다면 이걸 함수 파라미터로 넘기는게 아니라, 클래스 멤버 변수로 등록하면 코드가 깔끔해집니다. 그러나 여러 쓰레드에서 동시 접근이 가능

Naver Blog

리팩토링. 매개변수 대신 질의함수를 사용

매개변수가 있는 함수를 호출시 매개변수에 값을 적절히 넣어주는 것은 호출부의 책임입니다. 너무 많은 파라미터가 있다면, 호출부는 그 파라미터에 적절한 값을 넣어야 하는 부담이 있습니다. 만약 물건 가격 가져오는 함수에서 아래처럼 count 를 기반으로 discountLevel이 결정될 경우, 굳이 호출부에서 discountLevel과 count 두개를 모두 전달할 필요가 없습니다. count 만으로 discountLevel이 파생되어 나오기 때문입니다. if ( count > 100 ) discountLevel = 1; else discountLevel = 2; getFinalPrice(discountLevel, count); ////////////////////////////////////////// int getFinalPrice(int discountLevel, int count) { if ( discountLevel == 1 ) return 100 * count * 0.9;

Naver Blog

리팩토링. 조회 및 변경 함수로 분리

getMemberAndSendMai() 이라는 메서드가 있고 이 안에서 for loop 로 멤버를 찾고, 특정 멤버에 대해서만 이메일을 보내고, 이메일 보낸 멤버들을 리턴하는 코드가 있다고 합시다. 이 메서드를 통해 특정 멤버 리스트를 알고 싶기만 한데도, 이걸 호출하면 무조건 이메일까지 호출해버리니 테스트하기가 어렵습니다. 이런 경우 아래처럼 2개로 분리하도록 합니다. getMember(); sendMail(); 만약 위 2개가 항상 함께 동작해야 한다면 편의를 위해 getMemberAndSendMai()도 만들어주면 됩니다. 총 3개의 메서드가 만들어지며, 테스트시에는 전체를 테스트하려면 getMemberAndSendMai()을 호출하면되고, 단순히 조회용도이면 getMember() 를 호출하면 됩니다. 이렇게 조회,변경을 분리하여 테스트가 쉽도록 하는 습관을 가지도록 해야 겠습니다.

Naver Blog

리팩토링. 특이케이스 전용 클래스를 만들기

아래처럼 null 이거나 0 이거나 특정 값이 없는 특이 케이스가 존재해서 매번 전용 로직을 넣어야 하는 경우, 특이 케이스 전용 클래스를 이용해 볼 만합니다. int getPay(Member member) { if (member.getName() == null ) ? return 0; return member.getPay() * 3; } String getOrg(Member member) { if ( member.getOrg() == null ) ... } 아래처럼 특이 케이스 기본값이 세팅되도록 생성자를 만든후 class UnknownMember extends Member { UnknownMember() { super(0, null, 0, -1);' } 이후 부터는 분기 로직을 일일이 넣지 않더라도, 아래처럼 부모 클래스 타입을 통해 일관되게 구현을 할 수 있게 됩니다. return member.getPay();

Naver Blog

spring boot 환경변수/외부설정 정리

본 포스팅은 아래 강의의 환경변수 파트에 대해 ,추후 빠르게 remind 하기 위해 요약정리하였기에 친절한 설명이 없습니다. 자세한 설명은 아래 강의를 수강하세요 :) https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9 스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런 www.inflearn.com spring boot 에서 외부 설정(환경변수)에 대한 지원 우선순위 종류 예시 비고 1 커맨드라인 옵션인수 java -jar a.jar --myValue=1 --key=value 형식이며 spring 에서 key,value 로 파싱해줌 2 JAVA 실행 옵션 java -DmyValue=1 -jar a.jar

Naver Blog

spring boot autoconfiguration 정리

본 포스팅은 아래 강의의 자동 구성 파트에 대해 ,추후 빠르게 remind 하기 위해 강의 내용 요약정리 + 제가 아는 내용 추가 기입 하였기에 친절한 설명이 없습니다. 자세한 설명은 아래 강의를 수강하세요 :) https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9 스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런 www.inflearn.com @AutoConfiguration 자동구성용 config 일때 사용. proxyBeanMethods = false 로 기본 설정 되어 있어 proxy 가 만들어지지 않음 -> 불필요한 proxy 를 만들지 않기 위함. @Configuration(proxyBeanMe

Naver Blog

spring boot meta annotation 메타 어노테이션

java 에서는 지원되지 않으나 spring 에서는 어노테이션을 좀 더 쉽게 사용하도록 meta annotation 이라는 기능이 제공됩니다. @Component 어노테이션을 적으면 bean 으로 등록된다는 것을 이미 알고 있을겁니다. 그리고 @Controller 어노테이션을 적어도 bean 으로 등록되는것도 알고 있을겁니다. 그 이유는 Controller 어노테이션을 살펴보면 아래처럼 @Component 가 meta annotation으로 사용되고 있기 때문입니다. @Component public @interface Controller { } 상속 비슷한 느낌이 날겁니다. 네 맞습니다. spring 에서는 이런식으로 부모? 어노테이션의 기능을 자식? 어노테이션이 상속받을수 있으며, 이런 부모? 어노테이션을 "meta annotation" 이라고 부릅니다. 제가 부모? 어노테이션, 자식? 어노테이션이라고 물음표를 적은 이유는 java 에서는 어노테이션의 부모,자식 상속관계라는 개념도

Naver Blog

@Component vs @Configuration vs @AutoConfiguration in spring boot 3.x

@Configuration 어노테이션은 아래처럼 @Component 어노테이션을 메타 어노테이션으로 사용하고 있습니다. 즉 @Configuration 을 사용하면 해당 class 는 bean 으로 등록되게 됩니다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { 생략 } 그러면 @Component 를 사용할것이지 굳이 @Configuration 이라는걸 왜 사용할까? 라고 궁금할 수 있습니다. @Service 어노테이션의 경우 @Component 와 완전히 동일한 기능을 합니다만 서비스 용도의 bean 이라는 의미를 코드상으로 표시하기 위해 만들어진 어노테이션입니다. 아~ 그러면 @Configuration 도 설정용 bean 이라는 뜻을 표시하기 위한 어노테이션일 뿐인가요? 라고 물을수 있습니다. 정답은 no 입니다. s

Naver Blog

mybatis + Page + Pageable + spring boot 페이징: 2/2

이전 포스팅에 이어 mybatis 연동하여 page를 구현해 보겠습니다. #mybatis 에 대해 잘 모른다면 아래 링크를 참고해주세요 https://blog.naver.com/semtul79/222687917255 spring boot + mybatis - 기본 설정/사용법 1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring... blog.naver.com 테스트를 편리하게 하기 위해 #swagger 도 이용하겠습니다. mybatis, swagger 등 부수적인 코드가 좀 있으므로 포스팅 맨 아래에 github 링크를 달아둡니다. mybatis, swagger 등이 사용되기에 pom.xml 에 아래처럼 의존성을 넣어줍니다. <dependencies> <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-op

Naver Blog

spring boot executable jar (실행가능 jar) 구조

spring boot 가 나오기 전에는 대부분 .war 라는 확장자를 가진 파일에 jar 와 class 파일을 모두 넣어두고, tomcat과 같은 web container 의 특정 디렉토리에 .war 파일을 이동시킨 후, tomcat 을 구동하면서 .war 파일을 함께 구동하도록 하였습니다. spring boot 에서는 #executable #jar 을 지원하여 .jar 확장자를 가진 실행가능한 파일을 생성해줍니다. 그래서 위와 같은 번거로운 작업없이 아래와 같이 java -jar 명령어를 통해 실행이 가능합니다. java -jar xxx.jar #tomcat 은 어디갔나고요? .jar 안에 들어가 있습니다. 귀찮게 tomcat 따로 .war 따로 관리할 필요가 없습니다. 오~ spring boot 에서는 빌드 결과물이 실행가능한 jar 파일로 만들어지니 아주 편하구나.. 라고 생각이 들텐데 과연 spring boot 내부적으로 어떤 구조로 이렇게 실행가능한 jar 파일이 만들어지는

Naver Blog

ApplicationContext 을 통한 빈 생성 및 조회

spring boot 에서 #application #Context 가 빈 들을 관리하는 주체입니다. 그리고 spring boot 에서는 #annotation 기반으로 빈 들을 생성합니다. 그래서 spring boot 의 ApplicationContextFactory 에 대해 디버그를 해보면 아래처럼 AnnotationConfigServletWebServerApplicationContext 가 실제 application context 가 됩니다. 이름에서 알수 있듯이 어노테이션 기반으로 빈들을 생성, 조회할수 있게 해주고, 서블릿 웹서버에 특화된 application context 라는 뜻입니다. 빈 관리에 초점을 두기 위해 AnnotationConfigServletWebServerApplicationContext 에서 웹서버쪽 기능을 뺀 어노테이션 기반 application context 의 기능에 대해 알아보겠습니다. AnnotationConfigApplicationContext

Naver Blog

정적 팩토리 메서드 뜻과 장단점

일반적으로는 생성자를 통해 인스턴스 만드는게 제일 좋습니다. 그러나 몇가지 케이스에서 정적 팩토리 메서드를 사용하는게 더 좋을수 있으니 이런 경우에만 정적 팩토리 메서드를 사용하는게 맞습니다. 정적 팩토리 메서드란 아래처럼 생성자가 아닌 정적 메서드를 통해서 인스턴스를 생성하는걸 말합니다. Member member = Member.getInstance(); 장점: 특성에 맞는 메서드 생성 동일 시그니처 생성자가 여러개 필요시, 특성에 맞는 이름의 메서드를 여러개 만들 수 있습니다. 만약 아래처럼 age만으로도 Member 를 만들 수 있고 salary 만으로 Member 를 만들 수 있을까요? Member(int age) Member(int salary) int 를 매개변수로 가지는 생성자는 한개 밖에 못가지는게 java 규약이므로 위와 같은 2개 생성자는 만들수가 없습니다. 비지니스 특성상 위와 같은게 꼭 필요하다면 아래처럼 2개의 정적 팩토리 메서드를 만들면 해결됩니다. Memb

Naver Blog

빌더 사용할 상황과 lombok의 활용

아래와 같이 생성자의 매개변수 수와 종류가 다양하게 필요로 할때 모든 경우에 대해 생성자를 만드는건 너무 번거롭습니다. class Member { String name; int age; ... public Member(String name) {...} public Member(String name, int age) {...} ... } 멤버변수별로 가능한 조합대로 생성자를 만들지 말고, 모든 멤버변수를 매개변수로 가지는 생성자 하나 만들면 되지 않나? 라고 생각할 수 있으나, 이 경우 new Member("홍길동", 22, null, 1, "서울", 2020, 0, -1, 23, null ); 와 같이 사용하지 않는 멤버변수들을 null 이나 0, -1 등으로 값을 채워줘야 하므로 상당히 불편해지는 문제가 있습니다. 또한 멤버변수가 많다보니 생성자가 많아진거 아닌가? 그러면 생성자는 하나만 만들고, 멤버변수들에 대해 setter 를 두면 되지 않는가? 라고 생각할 수 있습니다. 물론

Naver Blog

싱글턴(singleton) 생성 방법 및 단점

객체를 반드시 하나만 만들어야 하거나, 하나만 만드는게 좋을때 싱글턴 생성 하는 방법 및 장단점에 대해 알아보겠습니다. private 생성자와 static 변수를 활용한 방법 아래처럼 static 멤버변수로 미리 객체를 만들어 두고 생성자는 private 속성을 줘서 외부에서 생성자 호출을 못하게 합니다. 그리고 getInstance()와 같은 메서드를 통해 static 멤버변수를 가져갈 수 있도록 해주면 됩니다. class Member { private static final Member INSTANCE = new Member(); private Member() {} // private 생성자를 통해 외부에서 생성자 호출 금지 public static Member getInstance() { return INSTANCE; } } 첫번째 단점은 테스트용 mock 객체를 만들수가 없기에 테스트하기 어렵다는 것인데 아래 예시를 한번 보겠습니다. DataSource 는 DB connect

Naver Blog

java 익명 클래스, 람다, 함수형 인터페이스, 메서드 참조

java 익명클래스, 람다, 함수형 인터페이스는 많은 경우 상호 호환/대체가 가능합니다. 예제를 보면서 알아보겠습니다. 아래처럼 list 객체가 있을때, ArrayList<String> strings = new ArrayList<>(); strings.add("a"); strings.add("b"); list 의 sort 를 호출시 2개 string 을 비교해주는 로직을 아래처럼 익명 클래스를 통해 넣어주면 동작합니다. strings.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return 0; } }); 익명 클래스 대신 아래처럼 람다를 사용해도 됩니다. strings.sort((o1, o2) -> { return 0;} ); 또한 명시적으로 Comparator 를 만든 후 대입해줘도 됩니다. Comparator<String> stringComparator = (o1, o2)

Naver Blog

remind Java. 클래스 초기화 블럭

클래스 생성자를 통해 멤버변수 초기화가 가능하기에 초기화 블럭은 사용할 일이 별로 없어서 까먹기 쉽습니다. 그러나 static 멤버변수 초기화 와 같이 클래스 생성자로 할수 없는 일들을 할 수 있으므로 초기화 블럭에 대해 자세히 알아보겠습니다. 초기화 블럭은 크게 클래스 초기화 블럭과 인스턴스 초기화 블럭으로 나뉩니다. 이름에서 알 수 있듯이 클래스 초기화 블럭은 프로그램이 시작되어 클래스를 메모리에 로딩할때 단 한번만 실행되며, 인스턴스 초기화 블럭은 인스턴스가 만들어질때마다 실행됩니다. 아래 클래스 초기화 블럭에서는 classId 라는 static 멤버변수를 초기화 하는데 사용되었습니다. 멤버변수 초기화는 String classId = "xxx"; 처럼 멤버변수 선언부에 값을 바로 넣어도 가능합니다. 그런데 아래 예시처럼 어떤 값을 읽어온 후 그 값에 따라 초기화 값이 달라지는 경우가 있습니다. 이 때는 클래스 초기화 블럭 외에는 방법이 없습니다. 초기화 블럭은 {} 와 같이 블

Naver Blog

remind java. super 그리고 상속

최상위 부모 클래스인 Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 같은 클래스의 생성자 혹은 부모 클래스의 생성자를 호출해야 합니다. 즉 this(); 혹은 this(x); 와 같은 같은 클래스의 생성자를 호출하거나 super(); 혹은 super(x); 처럼 부모 생성자를 호출해야 합니다. 만약 위와 같이 생성자를 호출하지 않는다면 컴파일러가 자동으로 super(); 를 생성자의 첫 줄에 삽입을 해줍니다. 아래처럼 부모의 생성자가 String을 매개변수로 받는 생성자일 경우, public class Parent { public Parent(String id) {} } 아래 Child의 2개 생성자중 Child(String)은 올바른 형식이나 Child()는 super() 를 호출하고 있기에 컴파일오류가 납니다. public class Child extends Parent { public Child(String id) { super(id); // 명시적으로 super

Naver Blog

remind java. package 그리고 물리 디렉토리

java 의 경우 package 명을 물리 디렉토리명과 1:1 로 매핑을 해줍니다. 즉 com.test.sample 이라는 패키지에 Test.java 라는 클래스가 있다면 실제 물리 디렉토리는 com/test/sample 디렉토리 내에 Test.java 클래스가 위치하게 됩니다. spring boot 프로젝트를 만들면 아래처럼 src/main/java 디렉토리 하위 부터 패키지가 적용되며, 아래는 me/developery 라는 디렉토리 내에 Child 클래스가 있으므로 실제 패키지는 me.developery 가 됩니다. 반대로 me.developery 라는 패키지가 있으니 물리 디렉토리는 me/developery처럼 구성되게 됩니다. 즉 둘다 같은 말이라는 겁니다. 그래서 IDE 에서는 아래처럼 디렉토리 구분을 점(.) 을 통해 표시하기도 하므로 디렉토리 명 자체가 aaa.bbb.ccc 가 아니라 aaa/bbb/ccc 라는 물리 디렉토리가 있음을 헷갈리지 않도록 합니다.

Naver Blog

spring boot actuator + admin + security 조합으로 모니터링 #2/3

spring boot actuator + admin + security 조합으로 모니터링 #1/3 https://blog.naver.com/semtul79/222860480010 spring boot actuator + admin + security 조합으로 모니터링 #2/3 https://blog.naver.com/semtul79/222860635786 spring boot actuator + admin + security 조합으로 모니터링 #3/3 https://blog.naver.com/semtul79/222861053124 지난 포스팅에 이어서 이번에는 spring boot admin 기능을 사용해서 actuator 를 쉽게 조회,제어 해보겠습니다. spring boot admin 은 관리자용 프로그램이며 크게 server 와 client 모듈로 구성됩니다. 따라서 아래와 같이 2가지를 따로 작업해줘야 합니다. 1) 모니터링/제어 하고 싶은 spring boot 에 clien

Naver Blog

spring boot actuator + admin + security 조합으로 모니터링 #3/3

spring boot actuator + admin + security 조합으로 모니터링 #1/3 https://blog.naver.com/semtul79/222860480010 spring boot actuator + admin + security 조합으로 모니터링 #2/3 https://blog.naver.com/semtul79/222860635786 spring boot actuator + admin + security 조합으로 모니터링 #3/3 https://blog.naver.com/semtul79/222861053124 이제 마지막으로 spring boot actuator 에도 security 를 적용하고 spring boot admin 에도 security 를 적용해서 안전하게 사용하는 방법에 대해 알아보겠습니다. 이전 포스팅을 통해 spring boot actuator 및 spring boot admin 의 서버 및 클라이언트 모듈 설치/설정은 모두 마쳤습니다. 서버와

Naver Blog

spring boot application.yml properties 자동완성 플러그인 in IntelliJ

#springboot 에서 config 파일로 사용되는 application.yml 이나 application.properties 을 보면 아래와 같이 자동완성 기능이 있습니다. #IntelliJ 사용하는 경우라면 아래와 같이 File > Settings > Plugins 에서 "spring boot assistant" 라고 검색해서 설치하면 됩니다. 너무 간단하죠? 이걸 알리고자 포스팅을 한건 아니고 위 자동완성되는 config 들은 의존성으로 넣어둔 jar 에서 제공하는 내용들입니다. 즉 의존성(라이브러리)에서 xxx.yyy 뒤에는 zzz 가 있다 라고 코딩되어 있어야 인텔리제이가 그걸 참고해서 자동완성을 해줄수 있는겁니다. 만약 여러분이 아래와 같이 yml 이나 properties 파일에 적는데, 이것도 자동완성이 되면 멋지겠죠? 이걸 포스팅하기 위한 사전 작업이라서 플러그인 설치 포스팅을 하였습니다. mytest.data.timeout=10 그럼 다음 포스팅부터 본격적으로 달

Naver Blog

spring boot 에서 자동완성이 안되거나 일부 내용이 제공되지 않을 경우 해결방법

spring boot assistant 라는 플러그인을 intellij 에 설치했음에도 yml 이나 properties 파일에 자동완성이 안되거나 일부만 자동완성되거나 하는 경우가 있습니다. 이에 대한 해결책을 알아보겠습니다. 테스트를 위해 spring boot project 를 우선 생성하고 아래 의존성을 넣어줍니다. <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> 위 의존성으로 인해 application.yml 에 mybatis 로 시작하는 config 를 적으면 자동완성이 되어야 합니다. 그러나 아래처럼 no suggestions 라고 나옵니다. 그러나 spring 이라고 치면 아래처럼 자동완성이 잘 됩니다. 아 혼란스럽습니다. ㅜ.ㅜ 이럴 때는 spring boo

Naver Blog

config 파일(yml,properties), 환경변수 java 에서 읽는 방법 in spring boot : @Value

spring boot 를 사용하면 config 파일로 application.yml 이나 application.properties 와 같이 yml 이나 properties 파일을 이용합니다. 이렇게 config 파일에 적힌 내용을 java 단에서 읽는 방법에 대해 알아보겠습니다. 우선 spring boot 프로젝트를 하나 생성합니다. 저는 아래처럼 java 11, spring boot 2.6.11 , web, lombok 의존성을 넣어서 생성했습니다. (생략) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>me.developery</groupId> <artifactId>

Naver Blog

config 파일(yml,properties), 환경변수 java 에서 읽는 방법 in spring boot : @ConfigurationProperties

지난 포스팅에서 @Value 를 이용한 환경변수 읽는 방법에 대해 알아보았습니다. 좀 더 좋은 방법으로 @ConfigurationProperties 를 이용한 방법을 알아보겠습니다. 아래처럼 @ConfigurationProperties 를 이용해서 application.yml 에 있는 mytest.name 과 mytest.age 필드에 대한 클래스를 만들어봅니다. prefix 에는 사용할 환경변수 앞 부분을 적어주면 됩니다. import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @Data @ConfigurationProperties(prefix = "mytest") public class MytestProperty { private String name; private int age; } 이제 spring boot 가 구동될때 위 클래스가 빈으로 등록되고, 환경변수값

Naver Blog

config 파일(yml,properties), 환경변수 java 에서 읽는 방법 in spring boot : custom 환경변수 자동완성

config 파일 읽기 시리즈 마지막 포스팅입니다. yml 파일에 여러분이 만든 custom 환경변수들도 자동완성 되는 방법을 알아보겠습니다. 우선 아래 링크를 읽어서 자동완성 관련 기본 지식을 쌓도록 합시다. https://blog.naver.com/semtul79/222865490890 spring boot application.yml properties 자동완성 플러그인 in IntelliJ #springboot 에서 config 파일로 사용되는 application.yml 이나 application.properties 을 보면 아래와 ... blog.naver.com https://blog.naver.com/semtul79/222865521293 spring boot 에서 자동완성이 안되거나 일부 내용이 제공되지 않을 경우 해결방법 spring boot assistant 라는 플러그인을 intellij 에 설치했음에도 yml 이나 properties 파일에 자동완성이... b

Naver Blog

mybatis + Page + Pageable + spring boot 페이징: 1/2

#springboot 에서 #mybatis 를 이용해서 DB 쿼리를 하고, #Page 와 #Pageable 을 이용해서 페이징 요청과 결과 받는 방법을 알아보겠습니다. 우선 페이징에 대해 간단히 알아봅시다. 멀리서 찾아볼것도 없습니다. 네이버 블로그 글 목록이 페이징을 통해 구현되어있기 때문입니다. 위와 같이 글 목록이 나오고 그 아래에 몇번째 페이지에 대한것인지를 알려주고 있습니다. 크롬 개발자 도구를 열어서 페이지번호를 눌러보면서 http 요청을 살펴보면 아래처럼 HTTP GET 요청을 보내는걸 알 수 있습니다. https://blog.naver.com/PostTitleListAsync.naver?blogId=semtul79&viewdate=&currentPage=3&categoryNo=19&parentCategoryNo=&countPerPage=10 특히 쿼리스트링으로 currentPage=3 <-- 이렇게 몇번째 페이지에 대한 요청인건지를 전달하고 있습니다. 위 http 요청

Naver Blog

java classloader 를 통한 클래스 파일찾기 - 기본편

java 의 #classloader 는 class 파일을 로딩하는 역할을 합니다. class 파일을 로딩하기에 당연히 이걸 통해 특정 class 가 어떤 파일에 있는지도 찾을 수도 있습니다. 이 방법에 대해 알아보고, 응용편으로 #클래스로더 를 이용해서 slf4j 의 binder 들을 찾는 방법에 어떻게 응용되고 있는지 알아보겠습니다. spring boot 프로젝트를 하나 만든 후 아래와 같이 의존성을 넣어줍니다. 로깅 및 테스트 코드 작성을 위해 의존성을 넣는 것이니 반드시 아래 의존성을 넣어야 클래스로더 를 사용할 수 있는건 아닙니다. <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.18.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>sl

Naver Blog

java classloader 를 통한 클래스 파일찾기 - 응용편: slf4j의 log4j2, logback binder 찾기

https://blog.naver.com/semtul79/222834361989 java classloader 를 통한 클래스 파일찾기 - 기본편 java 의 #classloader 는 class 파일을 로딩하는 역할을 합니다. class 파일을 로딩하기에 당연히 이걸 통... blog.naver.com 위 포스팅을 통해 클래스로더를 통한 클래스 파일 찾는 방법에 대해 알아보았습니다. 이제 위 기본 지식을 이용해서 slf4j 에서 log4j2 , logback 등과 연동되는 원리에 대해 상세히 알아보겠습니다. 우선 slf4j, log4j2 , logback 및 binder 에 대해서는 아래 링크를 통해 기본적으로 학습하시기 바랍니다. https://blog.naver.com/semtul79/222828702035 log4j, log4j2, logback 그리고 slf4j 관계정리 ( feat. spring boot ) - quick start 편 #java 의 #logger 에 대해

Naver Blog

Runtime.getRuntime().addShutdownHook 을 이용한 java graceful shutdown 설정법

#springboot 의 #graceful #shutdown 공부하면서 원리를 파고 들다보니 java shutdown hook 까지 오게 되었습니다. ㅡ.ㅡ 이번 포스팅에서는 자바 에서의 shutdown hook 에 대해 알아보겠으며, 다음에는 이를 기반으로 spring boot 에서는 어떻게 graceful shutdown 을 지원하고 구현하고 있는지 알아보겠습니다. 이번 포스팅의 영상 버전은 아래와 같습니다. https://youtu.be/imWQ1bD-H_g java 에서는 아래와 같이 Runtime.getRuntime().addShutdownHook() 라는 메서드를 통해 종료시 실행할 작업을 지정할 수 있습니다. addXXX와 같은 형식의 메서드이므로 1개 이상의 hook 을 지정할 수 있으리라 짐작할 수 있습니다. 파라미터에는 Thread 객체를 넣어주면 됩니다. 그러면 shutdown 시 해당 쓰레드의 run() 함수가 실행됩니다.이게 전부입니다. 혼동하지말아야 할게 아

Naver Blog

spring boot EventPublisher, @EventListener 사용법

spring boot 에서의 event 사용법 자체를 아는 것도 중요하나 , event 라는 개념의 필요성과 일반적인 구성방식/구성요소에 대한 이해가 더 중요합니다. 그래야 어떨때 event 를 쓰면 되는지를 정확히 알 수 있습니다. event 필요성 서로 다른 서비스간에 rest api 를 통해 통신을 주로 합니다. 보통 HTTP GET, HTTP POST 등을 통해 뭔가를 요청하고 응답으로 결과를 받습니다. 그런데 단순히 어떤 데이터나 이벤트를 다른 서비스에 넘겨주는것에만 관심이 있는 경우도 있습니다. 즉 상대 서비스의 결과응답이 별로 중요하지 않는 케이스입니다. 이런 경우 #kafka 와 같은 큐를 두어서 두 서비스간의 결합성을 없애주면 좋습니다. A 서비스 -- kafka --- B 서비스 이런 설계방향이 서비스간에만 적용되는건 아닙니다. 하나의 서비스 내부에서도 A 클래스, B 클래스 , C 클래스 와 같이 여러 클래스들이 있고 A 클래스에서 B 클래스로 단순히 이벤트나 데

Naver Blog

spring boot EventPublisher, @EventListener 고급편

아래 포스팅을 통해 #EventPublisher 와 #EventListener 를 이용한 이벤트 전달 방법에 대해 알아보았습니다. https://blog.naver.com/semtul79/222841420926 spring boot EventPublisher, @EventListener 사용법 spring boot 에서의 event 사용법 자체를 아는 것도 중요하나 , event 라는 개념의 필요성과 일반적인 구성... blog.naver.com 이번 포스팅에서는 사용방법이 아닌, 내부 구조와 실제 어떤 이벤트들이 이 방식으로 전달되고 있는지를 알아보겠습니다. 디버그모드를 통해 내부 흐름을 알아볼것이며, 사용되는 기본 소스코드는 위 사용법 관련 포스팅을 이용하겠습니다. 자. 이제 시작해봅시다. applicationEventPublisher 라는걸 통해 이벤트를 전달했습니다. 내부적으로 어떻게 전달되는지 확인을 위해 아래처럼 publishEvent() 메서드에 디버그 포인트를 걸고 디

Naver Blog

spring boot 에서의 startup 시 로직넣는 법: 기본편

spring boot 에서 application startup 시점에 로직 넣는 다양한 방법에 대해 알아보고, 우선순위는 어떻게 되며 실무에서 생각해봐야 할 내용에 대해 다루어 보겠습니다 생성자를 이용하면 될듯한데, startup 시점에 로직을 왜 넣어야 하나요? java 에서는 클래스의 생성자를 통해 해당 클래스의 객체가 생성될때 즉 startup 될때 원하는 로직을 넣을수 있습니다. spring 에서도 동일하게 생성자를 통해 로직을 넣어도 되나, 문제는 아래처럼 다른 bean 들을 생성자 내에서 호출하면 문제가 발생할 수 있습니다. 아직 다른 빈이 생성되지 않았을 수 있기에 null pointer exception 이 발생할 수 있습니다. @Component public class MyTest { @Autowired MyCustomService service; public MyTest() { server.xxx(); // 생성자에서 다른 bean 을 호출하는 경우 문제 발생 }

Naver Blog

spring boot actuator + admin + security 조합으로 모니터링 #1/3

spring boot actuator + admin + security 조합으로 모니터링 #1/3 https://blog.naver.com/semtul79/222860480010 spring boot actuator + admin + security 조합으로 모니터링 #2/3 https://blog.naver.com/semtul79/222860635786 spring boot actuator + admin + security 조합으로 모니터링 #3/3 https://blog.naver.com/semtul79/222861053124 #spring #boot #actuator 를 이용하여 cpu, mem, thread count 등의 metric 정보를 모니터링 할 수 있습니다. 또한 #spring #boot #admin 을 이용해서 spring boot actuator 에서 제공하는 metric 정보를 ui 를 통해 확인 및 제어할 수 있습니다. 확인 및 제어라고 적었습니다. cpu,

Naver Blog

네트워크계의 CCTV - wireshark 로 network trouble shooting 한방에 끝내기

youtube 영상 화면조작이 많기에 영상버전 시청을 권장합니다. https://youtu.be/v7vAoqGXe8I https://youtu.be/H1SdVrBKccw 네트워크 관련 흔히 접하는 문제들 "TCP 3 way handshake 는 3개의 패킷을 주고 받으면서 통신을 셋업한다" 와 같은 말이나 그림을 보면 적당히 이해는 가지만 완전히 내것으로 만들기가 어렵습니다. 패킷은 눈에 보이지 않으니까요. => 아닙니다! #wireshark 라는 툴을 이용하면 오고 가는 패킷들을 눈으로 볼 수 있습니다. "양쪽에서 통신을 하다가 몇분 지나면 연결이 끊어집니다. client, server 중 어느쪽이 연결 끊기를 시도한건지 알수가 없네요" => wireshark 를 이용하면 연결 끊어진 시점에 어떤 패킷을 주고 받았는지를 볼 수 있어 범인(?)을 잡을 수 있습니다. "HTTP 헤더에 값을 세팅해서 보냈는데 상대방이 헤더에 그 값이 없다고 합니다. 누구 말이 맞는거죠?" => 서버나

Naver Blog

서버 관리자를 위한 network 지식- netstat

8080 포트로 서버로 접속하려고 하면 timeout 오류가 납니다. 서버 살아있는거 맞나요? 접속이 되었다가 안되었다가 합니다. 뭐가 문제죠? 서버 관리자라면 위와 같은 질문을 종종 받게 됩니다. 여러분은 이때 어떤 일을 하시나요? 저는 가장 먼저 netstat 명령어를 이용해서 네트워크 상태부터 확인하길 권장 드립니다. netstat 은 network status 확인용 명령어라고 생각하면 됩니다. 약간의 옵션이 다르긴 합니다만 window와 linux 모두 netstat 사용이 가능하며, 여기서는 리눅스 환경을 기준으로 설명드리겠습니다. 뒤에 윈도우와의 차이점 약간 설명하겠니다. 기본 지식 우선 리눅스서버에 접속해서 좀 더 자세히 살펴보겠습니다. netstat 이라는 명령어로 네트워크 상태를 알수 있으며 -ant 는 TCP 정보를 알 수 있게 해주는 옵션입니다. $ netstat -ant Active Internet connections (servers and establish

Naver Blog

서버 관리자를 위한 TCP 지식 - SYN_SENT, ESTABLISHED, TIME_WAIT

TCP 가 뭔가요? 라고 누군가가 묻는다면 3 way handshaking 으로 연결을 맺고 송신 데이터에 대해 잘 받았다는 응답을 전달함으로써 신뢰성있는 전송이 가능한 프로토콜이다. 정도는 대답할 수 있을 겁니다. 서버 관리자에는 이 정도 지식으로는 제대로 된 서버 관리가 어렵습니다. 이번 포스팅에서는 TCP 프로토콜에서 서버 관리자에게 꼭 필요한 부분만 골라서 알아보겠습니다. TCP Status < 출처: https://ssup2.github.io/theory_analysis/TCP_Connection_State/ + 빨간색으로 내용 추가> 위 그림만 보니 머리가 아픈 분이 계실겁니다. 모두 알 필요는 없으니 벌써 포기하지 맙시다. 우선 각 영역에 대해 알아봅시다. connect(), bind(), listen() 처럼 괄호가 있는 부분은 시스템콜 함수를 나타냅니다. C언어를 사용해봤다면 socket 통신시 connect(), bind(), send(), close() 등의 시스

Naver Blog

초보자를 위한 HTTPS, SNI, 서버인증서, SSL Proxy

INTRO 많은 회사에서 외부(=인터넷)와 주고 받는 트래픽을 모니터링하고 있습니다. 그래서 종종 "사내 자료를 외부로 이메일 전송하다 적발" 이런식의 보안사고(?) 공지사항이 올라올때가 있습니다. SSL(=TLS)을 이용하지 않을 경우 어떤 내용을 외부로 업로드 했는지 알 수가 있습니다. 보통 사내 -> 사외 로 나가는 구간의 트래픽을 모니터링하면 되니까요. 그런데 SSL 즉 암호화 통신을 하는 경우 트래픽을 모니터링 해봤자 그 내용을 알 수가 없습니다. 암호화된 내용을 복호화할 수 있는 key 가 없기 때문이죠. 그래서 https://mail.naver.com/ 과 같이 이메일 사이트 자체를 접근하지 못하도록 하기도 합니다. SSL 위에 HTTP 가 올라가므로 mail.naver.com 이라는 도메인도 암호화가 될듯 한데 어떻게 알아낼까요? SNI 라는 것에 힌트가 있습니다.(아래에서 자세히 다룹니다.) 위와 같이 특정 사이트 접근을 막더라도, https://www.naver.c

Naver Blog

Database with spring boot #1/2

본 포스팅은 인프런 김영한 강사님의 스프링DB 강의내용을 기반으로 작성하였으며 일부 제 생각이나 이해한 내용을 추가로 적었습니다. DataSource DataSource 인터페이스의 주요 역할은 Connection을 가져오는 겁니다. 이게 hikariCP와 같은 pool 에서 가져올지, 아니면 요청이 왔을때 바로 생성해서 가져올지는 각 구현체에서 담당합니다. package javax.sql; import java.sql.Connection; (중략) public interface DataSource extends CommonDataSource, Wrapper { Connection getConnection() throws SQLException; (중략) } DataSource 구현체에서는 URL, id, pw 등을 config파일등으로부터 가져와서 connection 을 맺어줍니다. 즉 설정을 이곳에서 해주기에, 해당 Connection을 사용하는 곳에서는 URL, id, pw 등

Naver Blog

log4j, log4j2, logback 그리고 slf4j 관계정리 ( feat. spring boot ) - quick start 편

#java 의 #logger 에 대해 빠르게 정리해 보겠습니다. 결론만 적으면, #slf4j + #logback 혹은 #slf4j + #log4j2 를 이용해서 로거를 구성하세요. #logback 이나 #log4j2 단독으로 로거 구성도 가능하나 추천하지 않습니다. #log4j 는 사용하면 안됩니다. 자 그럼 각 로거에 대해 알아봅시다. log4j 2012년까지 사실상 표준으로 사용되던 로거입니다. 아래처럼 2012 년이 마지막 업데이트 날짜이고, 몇달전 이슈가된 log4j 보안문제도 그대로 가지고 있습니다. 밑에 빨간색으로 취약점이 있다라고 표시되어 있네요 pom.xml 에는 아래와 같이 넣습니다. groupId 와 artifactId 가 모두 log4j 입니다. 나중에 알아볼 log4j2 도 유사한 groupId 와 artifactId 이기에 혼동되지 않도록 주의해야 합니다. <!-- https://mvnrepository.com/artifact/log4j/log4j --> <d

Naver Blog

심리학으로 풀어보는 리더십

김경일 교수님의 동영상 강의 key point 정리 + 제생각 추가한 내용입니다 ㅡ private 동영상이라 링크없습니다 성격은 변하지 않으며, 좋은 리더십 발휘는 성격과 관계가 없다. 자신의 성격에 잘 맞는 리더십을 찾아서 발휘하는 것이 중요하다 사회적 기술을 개발하여 성숙한 성품을 만들면 탁월한 리더가 될수 있다. 당장 결과를 보는 일은 안했을때의 리스크를 먼 미래에 결과가 나올 일은 잘 했을때 얻을 이익을 설명하라. ex) 지금 인력충원하지 않으면 3달후부터 프로젝트 중단됩니다. 지금 이런 경험을 쌓아두면 10년 후에 이론과 경험을 모두 갖춘 개발자가 될수있습니다. 나이가 들수록 시간이 빨리 간다. 선배에게는 리스크 중심으로, 후배에게는 기대이익(먼 미래의 이익)을 중심으로 말을 하라. 빠른 속도는 공격성과 근거없는 자신감을 키울수 있으니, 속도를 늦추는 행동은 말과 공격성을 줄이고 겸손함을 키울수있다. 성급하거나 공격성이 강한 사람은 일부러라도 잠시 멈추고 생각하는 습관을 가

Naver Blog

[독서후기] IT 리더의 자리 ( 애자일 환경에서 CIO로 살아남기 위한 전략)

책을 기반으로 이해한 내용 및 제 생각을 넣어서 정리하니 100% 책의 내용만 있는건 아닙니다. 즉 제가 오해하거나 잘못 알고있는것을 적을수도 있습니다 저는 아직 IT리더의 자리에 있지 않아 책 내용의 일부는 공감하지 못하거나 생각도 해보지 않은 것들도 있어 다소 어렵게 느껴지는 책이었습니다. 몇년후 다시 보면 새롭게 알게 되는내용이 많을듯 합니다. :) #애자일 환경이라는 단서가 책 제목에 붙었듯이 이 책은 "민첩성"을 강조합니다. 계획을 맹목적으로 따르기보다는 수시로 점검하고 변환에 적응하는게 중요합니다. 한 주기의 시간이 짧을 수록 피드백을 받아 분석하고 분석 결과를 적용하는 시간도 짧아집니다. 애자일 프로젝트는 가능한한 빠르게 초기 제품을 전달하고 이를 점진적으로 발전시키는 것입니다. 빠르게 배포가 되니 피드백을 빨리 받고 이를 통해 점진적으로 발전하는 것도 빠르게 가능합니다. #LEAN 사고 : lean 은 영어로 군살없는, 호리호리한 이라는 뜻입니다. 린 사고방식은 프로세

Naver Blog

비전공자를 위한 자료구조

출처 비전공자를 위한 자료구조 in C & Java 경북대학교 전자전기컴퓨터학부 류춘근 ( [email protected] ) < 나름대로 시간을 할애하여 강좌를 쓴 만큼, 자료 출처나 글쓴이에 관한 정보를 허위로 작성하여 배포하지 마시기 바랍니다. ^^;> ‘Java로 구현한 자료구조1’ 이라는 강좌를 쓴 지 어느덧 1년이라는 시간이 흘렀군요. 그 강좌를 통해서 , 저 자신에게 자료구조에 관해 다시 한번 정리하는 시간이 되었고 비전공자나 자료구조를 잘 다루지 못 하시는 분들에게 어느 정도 도움이 된 것 같아 강좌를 쓰는 동안은 힘들었지만 나중에 느끼는 보람은 이루 말할 수 없었습니다. 그 동안 성원해 주신 분들께 감사드리며 , 여름방학을 맞이하여 지난 강좌를 쓴 이후 학교서 배운 ‘자료구조2’와 ‘Java 프로그래밍’ , ‘알고리즘’ 등등에서 터득한 노하우를 바탕으로 ‘비전공자를 위한 자료구조 in C &Java ' 와 ’비전공자를 위한 알고리즘 in C & Java’라는 강

Naver Blog

비전공자를 위한 알고리즘

출처 비전공자를 위한 알고리즘 경북대학교 전자전기컴퓨터학부 류춘근 ( [email protected] ) < 나름대로 시간을 할애하여 강좌를 쓴 만큼, 자료 출처나 글쓴이에 관한 정보를 허위로 작성하여 배포하지 마시기 바랍니다. ^^;> ‘Java로 구현한 자료구조1’ 이라는 강좌를 쓴 지 어느덧 1년이라는 시간이 흘렀군요. 그 강좌를 통해서 , 저 자신에게 자료구조에 관해 다시 한번 정리하는 시간이 되었고 비전공자나 자료구조를 잘 다루지 못 하시는 분들에게 어느 정도 도움이 된 것 같아 강좌를 쓰는 동안은 힘들었지만 나중에 느끼는 보람은 이루 말할 수 없었습니다. 그 동안 성원해 주신 분들께 감사드리며 , 여름방학을 맞이하여 지난 강좌를 쓴 이후 학교서 배운 ‘자료구조2’와 ‘Java 프로그래밍’ , ‘알고리즘’ 등등에서 터득한 노하우를 바탕으로 ‘비전공자를 위한 자료구조' 와 ’비전공자를 위한 알고리즘 ‘라는 강좌를 쓰게 되었습니다. 자료구조 강좌에선 기존의 ‘Java로 구

Naver Blog

아마존 알렉사 앱 개발 후기(how to develop amazon alexa app)

amazon alexa 아마존 알렉사 앱 개발 후기(how to develop amazon alexa app) Hello World 2018. 1. 17. 17:22 이웃추가 본문 기타 기능 * ASK(Alexa Skill Kit)을 이용한 Custom skill 개발 후기입니다. 2017년 2월에 아마존 에코닷을 샀는데 이제서야 처음으로 제가 만든 앱(skill 이라고 부르죠)을 publish 했습니다. amazon.com 에서 아래처럼 ESL number game 이라고 검색하면 아마존 에코 용 앱이 나옵니다. ㅎㅎ ESL 이란 English Second Language 라는 뜻으로 우리처럼 제2외국어로 영어를 쓰는걸 뜻합니다. 정리하면 non native speaker 를 위한 영어공부용 숫자게임입니다. 자 이제 본론으로 들어가서 어떻게 아마존 알렉사 앱을 개발하면 되는지 살펴봅시다. 큰 그림 위주로 설명을 하겠고, 각 스텝마다 사용된 기술이나 방법은 내용이 방대하여 간략하게

Naver Blog

알렉사(alexa) 로 휴대폰,스마트폰 찾기

amazon alexa 알렉사(alexa) 로 휴대폰,스마트폰 찾기 Hello World 2018. 1. 18. 23:59 이웃추가 본문 기타 기능 IoT 카페에서 아마존 알렉사를 이용해서 스마트폰 찾는 방법을 알게 되었다. http://cafe.naver.com/amazonecho/193 알렉사로 핸드폰 찾기 - Track... 우리끼리 나누는 이야기가 있다 cafe.naver.com 방법이야 위 링크를 따라 해보면 작동하는걸 알수 있고, 여기서는 그 원리에 대해 생각해보자. 참고로 alexa가 뭔지 모르는 사람, 이 휴대폰 찾기 skill을 사용해보지 않는 사람은 아래 글 봐도 이해못함. ( 아 과연 몇명이나 이 글을 이해할지..ㅡㅜ) 단순 예상이니 100% 믿지는 말자. 알렉사가 pin code 6자리를 말해주고, 그걸 스마트폰 앱에 입력하면 페어링(?)이 된다. 그 이후로는 알렉사에게 "내 휴대폰 찾아줘"(당연히 영어로) 라고 말하면 휴대폰에서 소리가 난다. 왜 pin cod

Naver Blog

아마존 alexa(알렉사), ifttt 연동원리에 대해

amazon alexa 아마존 alexa(알렉사), ifttt 연동원리에 대해 Hello World 2018. 1. 19. 11:03 이웃추가 본문 기타 기능 아마존 알렉사가 들어가있는 에코와 ifttt 연동법에 대해 알아보자 네이버에 아마존 알렉사 에코 ifttt 라고 검색하면 연동 방법에 대해 수많은 웹페이지들을 볼 수 있다. 그래서 여기서는 사용법 보다는 개발자 관점에서 접근해보자 우선 사용법에 대해 간략하게 알아보자 휴대폰에 ifttt ( 이프트 라고 읽는것 같다 )을 구글 플레이에서 다운받아서 설치한다. 아마존 에코를 집에 설치한다. 아마존 에코는 스피커 내장된 하드웨어이다. ifttt 에서 alexa를 선택하면 이미 만들어져있는 applet ( 그냥 서비스라고 보면 된다.)들이 나오고 나만의 서비스도 만들수 있다. 알렉사에게 'bingo' 라고 말하면, gmail을 보내는 서비스를 한번 만들어 봤다. 처음에는 아니 어떻게 ifttt가 나의 알렉사를 알아채고, 나의 gmai

Naver Blog

알렉사 홈 스킬 개발 후기 (how to develop Alexa Home Skill )

amazon alexa 알렉사 홈 스킬 개발 후기 (how to develop Alexa Home Skill ) Hello World 2018. 1. 20. 23:19 이웃추가 본문 기타 기능 알렉사 스킬에는 크게 3가지가 있습니다. Custom skill ,Smart Home Skill 그리고 Flash briefing 입니다. Custom skill 은 Alexa, ask XXX to play the music. 처럼 ask XXX 과 같은 invocation name이 필요한 서비스이며 Smart Home skill 은 Alexa, turn on kitchen light. 처럼 별도의 invocation name 필요없이 명령을 할수 있습니다. 이게 더 해야할 말이 짧으니 더 편리하겠죠? (Flash briefing은 뉴스관련 서비스 입니다.) 이번 포스트에서는 사용자 관점의 글이 아니라 개발자 관점의 글입니다. 즉 이미 만들어진 알렉사 홈 스킬을 어떻게 쓰면 되냐? 가 아니라

Naver Blog

가상화폐 채굴이 왜 필요한가? why bitcoin mining is needed

요즘 가상화폐 때문에 말이 참 많습니다. 그래서 IT에 별 관심이 없는 사람도 가상화폐 채굴 이라는 말을 들어봤을테고, 인터넷에서 검색해봤을텐데 GPU, 블럭체인, 전기료 뭐 이런 얘기들만 주로 나올뿐 채굴을 왜 해야하냐. 왜 필요하냐에 대해서 잘 설명하는 글을 찾기가 어렵더군요ㅡㅜ 역시나 구글님에게 why bitcoin mining is needed 라고 물어보니 명쾌한 대답을 얻을수 있었습니다. 블로그에 방문자 늘리고자 낚시성 제목, 알맹이 없이 그림만 잔뜩 있는 블로그들 ! 때문에 화가 나서 제가 적습니다. 우선 가상화폐 라고 검색해서 이것저것 글을 읽어보면 IT 전문가가 아니더라도 아래의 사실은 알수 있습니다. 1.가상화폐 채굴이란 컴퓨터의 자원을 이용해서 특정 작업을 하다보면 확률적으로 가상화폐를 획득하는 것을 뜻한다. 그리고 채굴을 하는데 GPU를 주로 사용한다. 이 GPU 들은 어려운(=전력소비가 많이 드는 무거운) 작업들을 수행하고 , 그런 작업들을 하다보면 확률적(?

Naver Blog

함수형 프로그래밍과 테스트 주도 개발(functional programming & Test Driven Development(TDD))

프로그래밍일반 함수형 프로그래밍과 테스트 주도 개발(functional programming & Test Driven Development(TDD)) Hello World 2018. 1. 30. 13:04 이웃추가 본문 기타 기능 몇년전부터 함수형 프로그래밍(functional programming)이라는 패러다임이 hot 하다. 그리고 그 이전부터 TDD( 테스트주도개발, 테스트우선개발, Test Driven Development )도 hot 하였다. 두 가지에 대해 공부를 하다 보니 "어라! 두개가 서로 공통점이 있네!" 라는 생각이 들었다. 공통점은 바로 함수를 모듈화하여 한가지만 수행하는 함수로 만들고, 전역변수와 같은 함수 밖의 상태에 영향을 받지 않는.. 오로지 입력으로 받은 파라메타에만 영향을 받고, 함수 수행결과로 전역변수와 같은 함수 밖의 상태에 영향을 주지 말고, 오로지 리턴값으로만 수행결과가 나오도록 코드를 작성하자.이다. 위의 말은 함수형 프로그래밍에서 자주 듣

Naver Blog

라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기

울 와이프님께서 외출시마다 항상 "가스불 확인했어?" 라고 걱정을 하여 가스밸브가 잘 닫혀있는지 확인하는 프로그램을 짜보기로 했어요 큰 구조는 아래와 같습니다. 휴대폰/PC의 브라우저 ------ 웹서버 ---------- 라즈베리파이 --------- 가스밸브 빨간색은 외부망을 사용하고, 초록색은 집안. 즉 내부망을 사용하겠지요. 공유기의 NAT를 이용해서 공인ip로 라즈베리파이에 접근가능하도록 하면 위의 빨간색 웹서버가 불필요한데 저희 집은 공유기에 공유기가 다시 연결되어 있는 구조이고(NAT 2번이나 설정해야 함ㅡ.ㅡ;) 추후 머신러닝을 통해 밸브 잠김/열림을 예측하도록 할 예정이어서 AWS(클라우드)와 연동하도록 구조를 잡았습니다. 가스밸브 확인 서비스를 구현하기 위해서는 해야할 일이 꽤 있습니다. 1. 라즈베리파이 및 카메라 모듈 구매 , 설치 2. AWS (amazon web service )에 가입 및 S3, IoT 서비스 사용법 배우기 3. 코딩은 모두 python으로

Naver Blog

라즈베리파이 설치 및 카메라 모듈 테스트

아래 서비스를 위한 첫번째 단계를 이제 시작합니다 https://blog.naver.com/semtul79/221468226031 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 울 와이프님께서 외출시마다 항상 "가스불 확인했어?" 라고 걱정을 하여 가스밸브가 잘 닫혀있는... blog.naver.com 우선 라즈베리파이를 구매하도록 합시다. 네이버에서 라즈베리파이 검색하면 다양한 종류가 나오며, 제가 구매한 것은 아래와 같습니다. 라즈베리파이 3 B+ 스타터 키트 ( 7만원 ) + 카메라모듈(3.3만원) = 약 10만원 ㅡㅜ 라즈베리파이는 이번 프로젝트를 하면서 처음 접했기에 뭐가 더 좋은지, 비싸게 산건지 뭐 그런건 모르겠습니다. https://inflow.pay.naver.com/rd?no=500020340&tr=ppc&pType=P&retUrl=https%3A%2F%2Fsmartstore.naver.com%2Fmain%2

Naver Blog

AWS 회원 가입 및 S3, EC2 사용하기

아래 프로젝트의 2번째 단계로 클라우드 서비스 중의 하나인 AWS 를 이용하는 것에 대해 알아봅시다. 라즈베리파이 + aws IoT/S3 + flask + python 사용한 가스밸브확인 서비스 개발 후기 울 와이프님께서 외출시마다 항상 "가스불 확인했어?" 라고 걱정을 하여 가스밸브가 잘 닫혀있는... blog.naver.com https://blog.naver.com/semtul79/221468226031 AWS 는 조건부 1년 무료입니다. 서버 여러대 사용하고 대용량 파일을 저장하고.. 와 같이 개인이 아니라 기업처럼 사용하면 무료 사용량 초과분에 대해 과금이 됩니다. 다만 작은 서버 1대, 몇백메가 바이트 파일 저장 과 같은건 무료로 사용할 수 있습니다. AWS 회원 가입은 아래 링크에 잘 정리되어 있으니 참고하시고, 이메일 기반으로 id가 정해지므로, 1년이 지난 후 새로운 이메일id로 가입하면, 그 아이디로 다시 1년 무료로 사용할 수 있습니다. 또한 아마존 알렉사(IoT

Naver Blog

install Apache2 + Django on ubuntu 18

ubuntu 에 Django 와 apache2 설치 및 연동하는 방법에 대해 적습니다. 공식 홈페이지와 여러 사이트를 검색했으나 정확히 동작하는걸 찾을수 없었으며 아래 동영상을 통해 apache + Django 연동 할 수 있었습니다. 1시간짜리 동영상이며 영어이니;; 암튼 참고하세요 https://www.youtube.com/watch?v=Xjdv31k-Kf4 위 동영상을 다 보기 어려우니 필요한 부분만 아래에 정리합니다. 우선 아래처럼 apt-get 을 update, upgrade 합니다. $ sudo apt-get update $ sudo apt-get upgrade 저는 AWS EC2 를 이용해서 테스트했으며, ubuntu 18을 선택했기에 계정명은 ubuntu 입니다. 그래서 home 디렉토리는 /home/ubuntu 입니다. 홈 디렉토리에서 아래처럼 tutorial 이라는 디렉토리를 생성합니다. 그런 후 아래처럼 디렉토리를 몇개 만듭니다. 꼭 이럴필요는 없습니다. 일단 그

Naver Blog

how to install apache spark on ubuntu ( 우분투에서 spark 설치 )

ubuntu 18 에서 apache spark 을 설치해서 구동해 봅시다. ( 일단 python 으로 프로그래밍하는 전제로 환경설정을 하며, yarn 등은 이용하지 않고 단일 모드로 구동합니다. ) 저는 AWS 에서 EC2 - ubuntu 18 을 사용했습니다. ( cpu 2 + mem 4 GB ) 프리티어용 인스턴스를 사용하면 spark 설치하고 구동하다보면 메모리 부족해서 시스템이 죽어버리네요. 넉넉하게(?) 4 GB 인스턴스를 구동합니다. ( 시간당 0.1 달러 정도 비용이 드니 안쓸때는 중단하세요 ) 아래처럼 apt-get update & upgrade 하고 python3 및 python3용 pip도 설치합니다. 나중에 통계 그래프를 그리기 위해 matplotlib 도 미리 설치합니다. $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get python3 $ sudo apt-get install python3-pip $ pi

Naver Blog

how to create cluster for apache spark ( 아파치 스파크 클러스터 구성 방법) - standalone

이전 포스트에서 apache spark 설치를 완료하였습니다. 추가적으로 모니터링 설정을 더 하여 관리를 쉽게 해보도록 하죠 ! 다시 한번 적지만, 본 환경설정은 YARN 등을 이용하는게 아니라 단일모드(standalone)용 환경구성입니다. 우선 spark 로그 파일이 생성되도록 아래와 같이 logs 디렉토리 생성 및 spark config 파일을 생성합니다. 친절하게도 spark 에서는 config 파일 템플릿 파일이 존재하며, 그것을 복사한 후 vi 로 열어서 log설정을 합니다. $ mkdir /opt/spark/logs $ cd /opt/spark/conf $ spark-defaults.conf.template spark-defaults.conf $ vi spark-defaults.conf 파일을 열면 모두 # 으로 주석처리 되어 있는데 아래 2부분만 주석 해제를 합니다. 그리고 spark.eventLog.dir 부분에는 아까 생성한 로그용 디렉토리 full path를 적어

Naver Blog

Flask 를 이용해서 웹프로그래밍 하기(in python)

flask는 python web framwork 중의 하나이며 Django 와 Flask 가 1,2등을 차지하고 그외에는 거의 사용되지 않는 추세인듯 합니다. Flask의 장점은 가볍다 입니다. Django의 경우 기본적인 뼈대가 알아서 만들어지고, 우린 그것의 뼈대에 맞게 프로그램을 짜야합니다. 즉 패턴이 정해져있습니다. 그러나 Flask는 그런게 없습니다. 그냥 마음대로 짜면 됩니다. 간단한 프로젝트나 자체적인 구조로 동작하는게 더 좋거나 기타 등등 여러가지 이유로 Flask를 이용합니다. 저는 오직 너무 간단하다! 라는 이유로 인해 이를 이용합니다. 우선 설치방법은 너무 간단해서 공식 홈페이지를 참고하세요. python, pip 등 몇개 명령만 실행하고 샘플 프로그램을 구동하면 너무나 쉽게 구동이 됩니다. http://flask.pocoo.org/ Welcome | Flask (A Python Microframework) overview // docs // community /

Naver Blog

gunicorn, flask 그리고 log 설정하기 with logrotate

#gunicorn 은 tomcat 과 같은 웹서버입니다. 보통 tomcat 은 자바와 연결되어 동작하고, gunicorn 의 경우 #python 와 연결됩니다. 정확히는 python용 웹 프레임워크인 #Django 나 #flask 를 구동시켜주는 웹서버입니다. 사용법은 간단하죠 만약 아래처럼 flask로 구현했다면 ( 파일명이 main.py 라고 가정 합시다 ) from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" 아래처럼 bind할 주소 및 포트, access log 와 error log 파일명을 지정하고, flask로 구현된 파일명과 Flask 파일내의 Flask 객체명을 조합해서 적으면 됩니다. $ gunicorn -b 0.0.0.0:8080 --access-logfile access.log --error-logfile error.log main:app fla

Naver Blog

pandas (판다스) 사용법 정리

이번 포스트는 #python #데이터분석 라이브러러인 #pandas 사용법에 대해 정리합니다. 친절하게 원리나 사용예시를 적는게 아니라, 문법이 가물가물할때 search 해서 예제 코드를 찾는데 목표를 두었으니 잘 모르는 사람은 우선 pandas 기본 공부부터 해야합니다. pandas 는 아래 youtube 강좌가 아주 잘 설명하고 있으니 영어이지만, 코드만 봐도 이해가 되니, 꼭 다 보세요. 아래 비디오의 핵심만 본 포스트에 정리합니다. https://www.youtube.com/playlist?list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y Data analysis in Python with pandas - YouTube Learn how to use the pandas library for data analysis, manipulation, and visualization. Each video answers a student question using a

Naver Blog

aws kinesis data stream 사용하기 - 개요

#aws 에서 제공하는 대용량 처리용 큐인 #kinesis data stream 사용법에 대해 알아보겠습니다. #queue 이므로 당연히 1. 데이터를 집어넣는 producer 역할의 모듈이 필요하고, 2. 데이터를 빼내오는 consumer 역할의 모듈이 필요합니다. 저는 producer, consumer 라고 부르겠습니다. 앞으로 aws 에서 kinesis data stream 을 console 화면을 통해 생성/설정을 하며, python 으로 producer 및 consumer 를 작성하겠습니다. 이후 가짜 데이터를 주기적으로 producer 에서 생성해서 kinesis 를 통해 마지막으로 consumer 로 전달되는 것을 확인하겠습니다. kinesis가 뭔지, 장단점이 뭔지 등은 워낙 인터넷에 많으니 그곳에서 참고하시고 저는 실제 구현에 집중하겠습니다. 그럼 다음 포스트에서 aws 에서 kinesis data stream 생성하는 방법을 알아보시죠 ================

Naver Blog

aws kinesis data stream 사용하기 - 생성

#aws 콘솔화면을 통해 #kinesis data stream 생성방법을 알아봅시다. 콘솔화면은 수시로 버전업이 되어서 스크린 샷은 별 소용이 없는듯 합니다. service -> kinesis -> data stream 순으로 클릭을 합니다. kinesis 에서는 2019.05 현재 data stream, fire hose, data analytics, video stream 이렇게 4가지가 지원되고 있습니다. data stream 과 fire hose 가 유사한데, data stream 이 가장 기본적인 기능이고, fire hose 는 좀더 사용하기 쉽게 조합된 기능입니다. 실제 써보니 아래와 같은 장단점이 있습니다. 입력소스(producer 역할) 출력 방법(consumer 역할) 비고 data stream api api, fire hose, ... 가장 기본적인 queue 의 역할, api를 통해 입출력이 된다. queue 자체 delay(put후 get까지 걸리는 시간) 는

Naver Blog

AWS 접근권한 설정하기(IAM)

#aws 에서 #IAM 은 접근권한 관련된 설정을 도와줍니다. EC2 에서 S3 나 DynamoDB 와 같은 #aws 의 다른 서비스와 연동을 하려면 적절한 접근 권한을 만들고 그 권한을 EC2 의 특정 위치에 저장하거나 소스코드에 저장해둬야 합니다. 우선 콘솔화면에서 IAM 을 선택하여 메뉴화면을 로딩합니다. 이후 아래처럼 '사용자'을 클릭하고 '사용자추가' 클릭합니다. 이 후 적절한 사용자 이름을 넣고 액세스 유형에 '프로그래밍 방식 액세스'를 선택합니다. 콘솔화면의 설명에 나와있듯이 api, sdk 에 대해 액세스키를 부여하는 겁니다. 이후 아래처럼 어떤 권한을 부여할건지 선택하는 화면이 나옵니다. 우린 AWS 에서 제공해주는 기본 정책에서 선택할 것이므로 '기존 정책 직접 연결'을 선택합니다. 검색창에 S3, dyanmoDB, kinesis 와 같이 원하는 서비스 명을 입력하면 해당 서비스에 대해 ReadOnly, FullAccess, ... 등등 상세 권한들이 화면에 보입니

Naver Blog

aws kinesis data stream 사용하기 - producer

#aws #kinesis data stream 에 데이터를 put 하는 producer 를 만들어봅시다. aws 에서는 아래처럼 KPL(Kinesis Producer Library)를 제공하며, 이것을 이용하면 좀 더 쉽게 데이터를 put 할 수 있다고 합니다. https://docs.aws.amazon.com/ko_kr/streams/latest/dev/kinesis-kpl-config.html Kinesis Producer Library 구성 - Amazon Kinesis Data Streams AWS 설명서 » Amazon Kinesis Streams » 개발자 가이드 » Amazon Kinesis Data Streams에 데이터 쓰기 » Amazon Kinesis Producer Library를 사용하여 생산자 개발 » Kinesis Producer Library 구성 Kinesis Producer Library 구성 대부분의 사용 사례에서는 기본 설정으로 충분하지만 Kine

Naver Blog

aws kinesis data stream 사용하기 - consumer

이제 consumer 를 보도록 하겠습니다. consumer는 조금 복잡합니다. producer 는 shard 수에 상관없이 put 해도, PartitionKey에 의해 적절히 shard 들에 분배가 됩니다. consumer 는 가용한 shard 갯수만큼 for loop 돌면서 가져와야 합니다. 아래 소스에는 response['StreamDescription']['Shards'][0]['ShardId'] 처럼 0번째 shard를 하드코딩했는데, 이건 테스트 코드에나 쓰는 것이고, 실제로는 for loop로 모든 가용 shard에서 get_records를 호출해야 합니다. 5초에 한번씩 get_records를 호출하여 데이터를 가져오고, 만약 데이터가 있으면 print를 합니다. # -*- coding: utf-8 -*- import boto3 import time import json client = boto3.client('kinesis', region_name='ap-northe

Naver Blog

pyspark ( spark in python ) 개요

#빅데이터 분석에 사용되는 #spark 을 공부하고 있는데 괜찮은 강의가 있어 이를 기반으로 정리하고자 합니다. #edx 는 #MOOC ( 온라인 강의사이트?) 사이트중 하나이며 2019.6 현재 무료로 아래 강의를 들을 수 있고, 강의 자료(jupyter notebook)도 받을 수 있습니다. 저작권 우려가 있어 강의자료를 그대로 올릴 수는 없고 필요한 부분만 설명하겠습니다. 제가 영어가 짧지만 스크립트가 있기에 강의 듣는데는 큰 문제는 없답니다~ 여러분도 도전~~! https://courses.edx.org/courses/course-v1:UCSanDiegoX+DSE230x+1T2019a/course/ Course | DSE230x | edX Course , current location Big Data Analytics Using Spark You must be enrolled in the course to see course content. 로그인 or register and

Naver Blog

aws lambda + api gateway 로 REST api 웹서버 만들기

#aws 에서 웹서버 만드는 가장 쉬운 방법중 하나는 #lambda 와 #api #gateway 조합으로 만드는 것입니다. #lambda 를 통해서 입력을 받아 들인 후 json으로 응답을 내려보냅니다. #api #gateway 로 https domain을 생성하고 api gateway 와 lambda 를 서로 연결시켜 줍니다. 위 과정을 하나씩 해보도록 하겠습니다. (기본적으로 AWS가 뭔지, 계정 등록등은 되어 있다고 가정하고 진행합니다~!) 1) 람다 생성 저는 python 3.6을 런타임으로 이용하고 람다의 이름은 server_test 로 지정했습니다. 단순 사용법 설명이므로 굳이 python이 아니어도 됩니다. 이제 람다 설정은 끝났습니다. ( 이 포스트 끝부분에 람다 코드 내용 변경 사항이 조금 있습니다. 연동 확인 테스트시에는 코드 수정할 필요가 없습니다.) api gateway 메뉴로 가봅시다. api 생성 버튼을 클릭 후 아래처럼 새 API 를 만듭니다. 저는 tes

Naver Blog

개발 관련 링크 모음

아래는 구글링하면서 발견한 괜찮은 블로그들 모음입니다. 몇줄 대충 적어넣거나, 자기만 알아 듣게 적은 곳이 아닌 입문자/초보자에게 도움이 되는 곳입니다. 분야 링크 설명 spring, node 등 서버 분야 https://victorydntmd.tistory.com/ 나름 깊이 있는 내용, 자세한 내용이 많음. python https://haerakai.tistory.com/category/Python 파이썬 분야 쉽게 설명함 keras https://tykimos.github.io/lecture/ 케라스 상세 강좌 MQTT https://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt/ IoT 규약중 하나인 MQTT 에 대해 자세히 설명. 영어. ps. AWS IoT는 MQTT 규약중 일부만 지원함. docker 및 기타 https://subicura.com/ docker 관련 잘 정리되어 있음. nodejs https:/

Naver Blog

'데이터 분석의 힘' 독서 후기 - 1

데이터 분석을 위해 #pandas 와 #spark 등을 공부했는데 , 이런 툴을 이용해서 제대로 된 분석을 할 수 있는 기초가 부족하여 #데이터분석의힘 이라는 책을 읽고 후기를 남기려 한다. 책 줄거리만 적는게 아니라, 내용에 대한 나의 의견도 적는 것임을 밝힌다. 1. 데이터의 상관관계는 인과관계가 아니다. #데이터분석의 힘 신문 기사를 읽어보면 xx 회사는 올해 매출이 xx 만큼 올랐다. 참고로 작년에 xx 사장을 영입했다.. 와 같이 매출증가를 사장 영입의 결과. 즉 서로 인과관계라는 뉘앙스로 적힌 기사들을 많이 본다. 이런걸 볼 때마다 객관적이지 않은 기사라고 생각이 들었다. 매출 증가의 원인이 엄청 많을 것인데 왜 xx 사장 영입이 주요 원인인것처럼 적는걸까? 이 기자는 요인들을 다 분석하고나 이런 글을 적은걸까? 이런 나의 생각과 일치하는 문구인것 같다. "데이터의 상관관계는 인과관계가 아니다".. 이 책에서는 예로 "광고를 했더니 아이스크림 매출이 올랐다', 전기요금을

Naver Blog

'데이터 분석의 힘' 독서 후기 - 2

이전 포스트에서 인과관계를 밝히는 가장 좋은 분석 기법인 RCT에 대해 알아봤습니다. 가장 좋기만 하면 다른 분석 기법이 필요없겠지요? 단점으로 비용과 노력, 시간이 듭니다. 일부러 서로 다른 대조군을 만들어서 어느정도의 시간동안 서로 다른 환경을 구성해야 하니까요. 이번 포스트에서는 자연실험기법중의 하나인 RD 디자인에 대해 알아봅시다. 급격한 변화의 '경계선'을 찾는 RD 디자인 #데이터분석의힘 실험은 실험인데 자연실험은 뭘까요? 실험이니까 서로 다른 조건의 집단이 있을듯하고, 자연 이라고 하니.. 일부러 한게 아니라 자연스럽게 된거라는거죠? 맞습니다. 일부러 서로 다른 환경을 구성한게 아니라, 다른 외부요인에 의해 자연스레 서로 다른 환경으로 구성된 집단들이 나오게 되었고, 이 집단들의 데이터를 보고서, 여러가지 데이터중에서 인과관계를 밝혀내는 기법입니다. 예시로서는 "본인부담금을 변화시키면 의료서비스 이용빈도가 어떻게 달라질까?" 라는 주제입니다. 분석한 데이터로는 일본의 의

Naver Blog

'데이터 분석의 힘' 독서 후기 - 3

이제 또 다른 자연실험기법인 집군분석에 대해 알아봅시다. 계단식 변화가 있는 곳엔 집군 분석 #데이터분석의힘 우선 배경부터 설명을 하겠습니다. 환경을 위해 정부는 자동차 연비가 어느정도 수준이 넘으면 인센티브를 , 수준이 낮으면 패널티를 줘서 자동차 연비가 좋은 차들이 잘 팔리도록 노력을 합니다. 인센티브, 패널티는 자동차 업체에 부여할수도 있고, 소비자에게 부여할수도 있죠. 그리고 소형차의 연비와 대형차의 연비를 직접 비교하는건 의미가 없습니다. 소형차는 가벼우니 당연히 연비가 좋을것이고, 대형차는 무거우니, 그만큼 연비는 안좋을겁니다. 따라서 정부 정책은, 자동차 무게에 따라 권장/규제 연비가 정해지게 됩니다. 즉, 1000kg~1200kg 은 25km/l, 1200~1400 은 20km/l , ... 2000~2200은 10km/l 와 같이 말이죠 차량의 무게를 x 축으로 둔다면 연비규제치를 y축으로 둔다면 계단식으로 만들어집니다. 1000~1200까지는 동일 연비이다가 120

Naver Blog

java 8 람다(lambda) 정리

python 등을 써보면 자연스레 #람다 함수를 사용하는데, 이를 #java 에도 적용했다고 보면 됩니다. python 등에서 람다를 사용해봤다는 가정하에 java 에서의 문법과 다른 점만 살펴보고자 합니다. 우선 가장 간단한 샘플 코드를 한번 보시죠. list에 있는 단어들을 소팅하는 기능인데, 이를 기존 방법과 람다 사용한 버전으로 표시해봤습니다. package test; import java.util.ArrayList; import java.util.Comparator; public class Test { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("AA"); list.add("CC"); list.add("BB"); list.sort(byInstance); // 예전 방법. 함수 매개변수에 함수를 넣을수 없기에 인스턴스를 넣어줘야함. System.out.

Naver Blog

블록체인(blockchain) 정리 - 1 - 기본개념 및 참고링크

#블록체인 #blockchain 에 대해 공부하고 정리를 하고자 포스팅을 합니다. 우선 저는 SW개발자라서 단순 개념이해 정도가 아니라 어느정도 상세하게 이해가 필요했기에, 개념이해용 포스팅으로 그치지는 않을 예정입니다. 우선 개념이해를 위해 여러 youtube를 봤으며, 그중 괜찮은 것들을 아래에 적어둡니다. 초딩도 어느정도 이해할 수 있을만큼 개념위주의 내용이라서 가볍게 볼수 있습니다. 아래 링크들을 모두 봐서 어느 정도 블록체인에 대해 상식적 수준으로 이해를 했다고 가정하고, 저는 좀 더 깊은 내용만 다룰 예정입니다. 따라서 아래 링크들로 기본 개념은 꼭 익히세요. 제가 설명하는것보다 아래 링크의 유튜버가 더 설명잘합니다. ㅡㅜ 저는 유투버들이 설명하지 않는 좀 더 자세한 내용을 다룹니다. ^^ https://www.youtube.com/watch?v=BKLfMx5hscI https://www.youtube.com/watch?v=9sTvYuxcii8 이제 대충 이해는 하겠는데,

Naver Blog

블록체인(blockchain) 정리 - 2 - 블록체인의 필요성

앞 포스트에서 #블록체인 #blockchain 관련 유용한 링크들을 공유했습니다. 그것들이 지금 포스트의 참고 링크이기도 하고요. 블록체인 기본 개념은 워낙 글들이 많으니 그것들을 참고하시고 여기서는 좀 더 구체적으로 다루어 보겠습니다. 우선 용어 2가지만 먼저봅시다. 블록이란? > "A가 B에게 x 시각에 송금한 내역"을 하나의 블록이라고 할 수 있으며, "A와 B의 집거래내역" 도 하나의 블록이라고 할 수 있습니다. "1시 ~2시 사이 A은행에서 발생한 거래내역모두" 을 하나의 블록이라고도 할 수 있습니다. 즉 거래내역 한건을 블록이라고 할수 있으며, 여러 거래내역의 묶음을 하나의 블록이라고도 할 수 있습니다. 즉 데이터 처리 단위라고 생각하면 됩니다. 실제 비트코인과 같은 경우, 10분간의 거래내역들을 하나의 블록으로 처리합니다. 시간단위로 묶을지, 1건을 무조건 하나의 블록으로 할지는 각 시스템에 맞게 설정하는것이며, 블록이란 그것의 최소 단위입니다. 세부적으로는 하나의 블록

Naver Blog

블록체인(blockchain) 정리 - 3 - 블록 상세하게 알아보기

이제 기본용어와 왜 블록체인이 생겨났는지 알았으니 블록체인 내부 구조를 좀 더 알아봅시다. 블록체인은 블록들의 리스트입니다. 각 블록은 어떤 요소들로 구성되어 있고, 왜 그래야 하는지 알아봅시다. 아래 코드를 보시죠. 딱히 특정 언어 문법을 사용하지 않았습니다. 이해를 높이기 위해 적당한 type 도 지정했으며, 구현 언어에 맞게 적절히 세팅하면 됩니다. { int index; // 0부터 시작하는 index. 각 블록간의 순서 확인용 string previousHash; // 이전 블록의 hash값 저장용. 이를 통해 이전 블록이 변조되었는지 확인 가능 long timestamp; // 블록 생성시의 timestamp 값 long nonce; // 원하는 형태의 hash값 생성을 위해 사용되는 랜덤값 object data; // 실제 저장되어야 하는 정보. ( e.g. 거래내역, 공증내역, ... ) string hash; // 해당 블록 전체 요소에 대한 hash값. } 요소명

Naver Blog

블록체인(blockchain) 정리 - 4 - 블록들의 체인 상세히 알아보기

지난 포스트에서는 블록에 대해 알아봤고, 지금은 이 블록들의 체인, 블록들이 연결된 것, 즉 블록체인에 대해 알아보려고 합니다. 블록체인 자체는 간단합니다. 아래처럼 여러개를 담을수 있는 리스트에 블록들을 넣어주면 그게 바로 블록체인입니다. blockChain = List(); blockChain.add(genesisBlock); // 블록체인에 무조건 처음 들어가있는 블록을 genesis block 이라고 하며 이는 블록체인 생성시 무조건 넣어줍니다. blockChain.add(blockA); blockChain.add(blockB); ... 블록체인은 특정 주기마다 valid 한지 검사를 합니다. 특정 블록이 변조되었는지 확인해야 하기 때문이죠. valid한지는 previousHash 와 자신의 hash로 검사를 합니다. hash 라는 것 자체가 무결성을 검사하는 수단으로 많이 사용됩니다. 프로그램 다운 받을시 아래처럼 다운로드 링크와 함께 hash 값도 함께 알려주는 곳이 많습

Naver Blog

MSA 에서의 api gateway

#MSA #마이크로서비스아키텍처 에서 api gateway 라는 용어가 나옵니다. 네트워크에서 gateway 는 특정 네트워크의 관문 라우터를 뜻합니다. 즉 해당 네트워크로 in/out 되는 트래픽은 무조건 gateway 라는 라우터를 통과한다는 뜻입니다. api gateway 는 gateway 에 api 라는 단어가 앞에 붙어있군요. 특정 웹서비스의 모든 api(e.g. rest api )들이 무조건 통과해야 하는 관문 서버 라고 보면 됩니다. #Spring 이나 다른 언어의 웹서버 프레임워크를 보면 아래처럼 url path에 따라 수행해야 할 함수를 라우팅 합니다. 이곳에서의 라우팅은 도메인은 모두 동일하고 path나 method 를 가지고 수행할 함수를 매핑시켜줍니다. 아래 소스는 특정 프레임워크에 대한 코드가 아닙니다. 슈도 코드라고 보면 됩니다. @route(path="/login", method="POST") function loginController() { // 할일

Naver Blog

내구성있는 시스템만들기( fault tolerant system - ref. if kakao 2019 )

내구성 있는 시스템 만드는 방법에 대해 #if #kakao 에서 발표된 자료를 읽고 간단히 정리해봅니다. 원본은 https://mk.kakaocdn.net/dn/if-kakao/conf2019/%EB%B0%9C%ED%91%9C%EC%9E%90%EB%A3%8C_2019/T02-S01.pdf 혹은 https://if.kakao.com/2019/program 에서 볼 수 있습니다. if kakao 개발자 컨퍼런스 2019 세상은 전부 개발거리, if kakao 2019 - if.kakao.com if.kakao.com 장애의 원인은 HW 와 SW 로 구분할 수 있습니다. 하드디스크가 갑자기 맛이 갈수도 있고, SW적인 버그로 인해 특정상황에서 CPU나 메모리를 점유해서 시스템이 느려지거나 아에 죽을 수도 있겠지요. 가장 일반적인 내구성 있는 시스템 만드는 법은 물리적 인프라 장비의 이중화/다중화 입니다. 운영환경에서 인프라를 구축해봤다면, 항상 web 서버는 2대 이상, 즉 이중화/다중화

Naver Blog

우분투에 엘라스틱서치 설치 ( elasticsearch )

#우분투 18.04 에 #엘라스틱서치 ( #elasticsearch ) 설치하는 법에 대해 포스팅합니다. 참고로 저는 #AWS #EC2 에 #ubuntu 18.04 을 구동 시킨 후 자바 및 엘라스틱서치를 설치했습니다. 최종적으로 하나의 리눅스에 #엘라스틱서치 ( #elasticsearch ) , #키바나 ( #kibana ) , #로그스태시 ( #kibana ) 를 설치할 예정이므로 메모리는 최소 4GB 정도는 갖춰야 합니다. 부족하면 구동중에 강제 종료나 오동작할 수 있으니 참고하세요. ( 저는 2GB 에서 설치, 구동, 테스트 하다가 메모리 부족해서 지금 4GB 로 올려서 재설치했습니다. ㅡㅜ ) 우선 엘라스틱서치는 자바로 만들어져 있기에 자바가 필요합니다. 최신 엘라스틱서치의 경우 자바8 이상이 반드시 필요하므로 아래처럼 java 8 을 설치합니다. ( 그 이상의 버전도 가능할듯하나 여기서는 현업에서 주로 쓰는 자바 8을 설치하겠습니다. ) $ sudo apt install

Naver Blog

엘라스틱서치 환경구성 ( elasticsearch )

이번에는 #엘라스틱서치 ( #elasticsearch ) 환경구성에 대해 알아보겠습니다. 구성할 환경은 컴퓨터 1대만으로도 구성된 싱글 노드 이며, 이전 포스팅에서 알 수 있듯이 PC가 아닌 AWS와 같은 클라우드내의 리눅스에 설치를 해 놓은 상태입니다. 기본 config는 localhost 에서만 9200 포트로 접속이 가능합니다. PC와 같이 엘라스틱서치가 설치/구동중인 장비가 아닌 곳에서 http 요청 및 접속을 하면 테스트 및 확인이 편리하므로 이게 가능하도록 수정하겠습니다. config 폴더로 이동 후 아래처럼 elasticsearch.yml 을 vi 등의 에디터로 엽니다. $ vi elasticsearch.yml 이후 아래처럼 0.0.0.0 으로 수정 network.host: 0.0.0.0 저장을 하고 나서 elasticsearch 를 다시 구동시켜 봅니다. 저 같은 경우 그리고 대부분의 다른 분들도 아래처럼 2가지 에러 때문에 구동 실패가 될겁니다. [2019-10-28

Naver Blog

키바나 ( kibana ) 설치 및 엘라스틱서치(elasticsearch) 연동

#우분투 에 #엘라스틱서치 를 설치해 두었고, 이와 연동되는 #키바나 를 설치해보도록 하겠습니다. https://www.elastic.co/kr/downloads/kibana Download Kibana Free | Get Started Now | Elastic | Elastic Download Kibana Want it hosted? Deploy on Elastic Cloud. Get Started » Version: 7.4.1 Release date: October 24, 2019 License: Elastic License Downloads: Windows sha asc Mac sha asc Linux 64-bit sha asc RPM 64-bit sha asc DEB 64-bit sha asc Package Managers: Install with yum, dnf, or zypper Install w... www.elastic.co 위 사이트에서 다운로드할 이미지의 주소를 복

Naver Blog

엘라스틱서치 ( elasticsearch ) 인덱스 생성, CRUD , ...

#엘라스틱서치 ( #elasticsearch ) 에 #인덱스 를 생성하고 #매핑 을 설정한 후 실제로 데이터를 insert, delete, select 등을 해봅시다. 엘라스틱서치가 DB 이지만 일반 DB와 다른 용어를 사용하기에 용어정리를 잠깐 하겠습니다. 일반 RDB 엘라스틱서치 비고 Database, table index , type 일반 RDB는 하나의 Database 내에 여러개의 table을 가질수 있으나, 엘라스틱서치 6 (?)부터는 index당 오직 하나의 type 만 가질수 있습니다. 엘라스틱서치 7 에서는 일부 명령어에 type 부분을 생략하는게 디폴트로 되어 있습니다. row document column field schema mapping name: varchar age: int64 위와 같이 각 필드별 데이터 타입을 지정한걸 매핑이라고 합니다. 엘라스틱서치는 스키마 세팅없이 데이터를 insert 하면 해당 데이터를 체크해서 자동으로 스키마가 생성되나, 100%

Naver Blog

logstash 설치 및 설정

이제 #ELK 의 마지막인 #logstash 를 설치하고 설정하도록 합니다. 아래 사이트에서 적절한 파일 링크를 복사한후 https://www.elastic.co/kr/downloads/logstash 아래처럼 다운로드 및 압축해제를 합니다. $ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.4.1.tar.gz $ tar zxvf logstash-7.4.1.tar.gz 설치는 이게 끝이며, 어떤 파일을 읽어서 어떤 변환작업을 한 후, 어디다가 결과를 넣을지를 설정해야 합니다. 설정부분은 아래 페이지에 잘 정리가 되어 있으니 참고하세요 http://asuraiv.blogspot.com/2015/07/elasticsearch-logstash.html [Elasticsearch] Logstash 설치와 기본개념 1. 개요 Logstash는 입출력 도구이다. 다양한 종류의 로그 (System logs, webserver l

Naver Blog

키바나 ( kibana ) 에서 그래프 그리기

지난 포스트를 통해 #elasticsearch 및 #logstash , #kibana 를 설치 및 연동을 모두 완료했습니다. 마지막으로 #키바나 를 통해 데이터를 보기 좋게 그리는 방법을 알아보겠습니다. 우선 키바나를 구동시킨 후 브라우저에서 http://123.123.123.123:5601 와 같이 서버 ip로 접속을 합니다. 키바나는 기본적으로 5601 포트를 이용하며, 만약 접속이 안되면 방화벽 설정을 확인해보세요. 그리고 kibana.yml 내에 server.host: "0.0.0.0" 와 같이 설정했는지 확인해보세요. 접속 후 아래처럼 왼쪽의 그래프 모양을 클릭하면 그래프 그리기를 할수 있습니다. 저는 키바나 7.4.1 을 이용했기에 아래와 같은 화면이며, 다른 버전은 모양이 조금씩 차이가 납니다. 위의 + 버튼을 누르면 아래처럼 그래프 선택 화면이 나옵니다. 저는 가장 일반적인 line 그래프를 선택해봤습니다 선택하고 나면 데이터 소스를 선택하라고 나옵니다. 저는 es_l

Naver Blog

로그분석을 위한 엘라스틱서치 구성 ( = 인덱스 템플릿 )

매일/매시간 마다 생성되는 로그파일들을 분석하는 시스템을 구성한다고 가정해봅시다. 일반적으로 로그는 최근 일주일 정도만 필요하지 그 이상은 별로 필요하지 않습니다. 하나의 인덱스에 몇달전부터의 로그부터 현재 로그들까지 모두 들어간다면 시간이 지날수록 인덱스내의 데이터가 너무 많아질겁니다. 물론 분산처리가 가능한 #엘라스틱서치 이므로 노드 수를 충분히 크게 한상태로 구성하면 되겠으나, 몇달 지나서 의미없는 로그 데이터들이 굳이 용량을 차지할 필요는 없을겁니다. 그래서 매일 하나씩 인덱스가 생성되도록 구성하고, #키바나 에서는 그 인덱스들을 #인덱스패턴 으로 묶어서 하나로 처리할 수 있습니다. 오래된 인덱스는 DELETE /xxxx 처럼 HTTP 요청을 하면 지워지니 용량이 커질 염려도 없어집니다. 이전까지는 수동으로 index 하나 생성하면서 매핑 정보도 넣었습니다. 그러나, 이젠 매일 인덱스가 생성되어야 하므로, 뭔가 다른 방법이 필요하며 그것이 바로 #인덱스 #템플릿 ( #inde

Naver Blog

엘라스틱서치 클러스터 구성하기 ( = yellow 를 green 상태로 변경 )

클러스터 구성하는 것인데, 왜 yellow 상태를 green 상태로 변경하기 라고 부제목을 달았을까요? 보통 학습용으로 엘라스틱서치를 구성하면 노드1대만 설치합니다. 이러면 장애대응을 위한 #레플리카 샤드가 없게됩니다. #클러스터 상태는 #green , #yellow, #red 이렇게 3가지로 구분되는데 green 은 primary shard 및 replica shard 가 모두 정상일때를 나타내며, yellow 는 primary shard 는 정상, replica shard 는 비정상 일때, => replica 는 장애대응용이니 yellow 상태이더라도 서비스는 문제없이 잘 동작합니다. red 상태는 primary shard 가 비정상 이므로 서비스에 문제가 있습니다. 자 암튼 학습용으로 노드 1대만 설치하면 사실 클러스터 구성이 아니므로 복제본이 있을 replica shard 가 없어서 yellow 상태가 됩니다. GET /_cluster/health 위와 같이 클러스터 상태를

Naver Blog

&quot;실용주의 프로그래머&quot; 독서 후기 1/2

10년전에 읽고 "아 바로 이거야" 라고 찬사를 날린 이 책을 10년이 지난 시점에 다시 한번 읽어보고 정리를 합니다. 아래처럼 2007년에 출판된 책입니다. 같은 이름으로 개정판? 도 있는것 같더군요. 이 책에 대해 각 주제별로 짧게 정리된 포스팅은 인터넷에 많이 있으니 저는 개인적으로 중요하거나 인상깊거나 생각을 많이 하게 되는 것에 대해서만 다루겠습니다. 책에 적힌 내용과 저의 개인적인 생각이 섞여 있음을 미리 알립니다. 1. 아무리 철저히 테스트, 분석, 자동화를 하더라도 뭔가 잘못되는 일이 발생한다. 이해 관계자로 인해 프로젝트가 지연되거나 예상치 못했던 기술적인 문제가 발발한다. 자신의 능력에 대한 자부심은 가질 수 있으나, 실수나 무지 같은 단점이 있다는 것도 인정해야 한다. -> "이런건 당연히 알아야지. 이것도 몰라?" 이런 식으로 다른 사람의 실수나 무지를 깔보게 되는데, 나 또한 횟수나 정도가 조금 나을 뿐 , 나도 똑같이 실수하고 무지한 사람인것을 알아야 한다.

Naver Blog

&quot;실용주의 프로그래머&quot; 독서 후기 2/2

13. 방어적 코딩을 하라. 완벽한 코드는 절대 있을수 없다. 자신의 실수에 대비해 방어적으로 코드를 짠다. 메모리가 부족하면? 파일을 못찾으면? 읽기가 실패하면? 과 같이 거의 발생하지 않을 것이라도 체크하는 로직을 넣어둔다. 14. 계약에 의한 설계 프로그램이란 선행조건과 후행조건 이라는 계약에 맞게만 동작하면 된다. 선행조건은 입력 파라메타, 후행조건은 함수 내에서 처리한 결과이거나 리턴값이다. 그것만 지키면 최고다. 계약상 입력은 숫자형이라고 했는데, "123" 이라는 숫자 비슷한 문자열이 온다면 이를 처리안해줘도 괜찮은 것이다. 할수 있는 것에만 계약을 하면 된다. 장점은 요구사항과 보증의 문제를 전면으로 내세워 입력 도메인의 범위가 무엇인지, 경계조건은 무엇인지, 무엇을 전달한다고 약속하는지, 등을 설계 시점에 나열할수 있기에 설계시 많은 도움이 된다. 15. 망치지 말고 멈추라. 프로그램이 오류로 계속 동작하면 예상치 못한 더 큰 잘못을 저지를수 있기에 차라리 멈추는게

Naver Blog

저는 IT 블로거입니다

글쓰는걸 좋아하고 알려주는 걸 좋아하고 공부하는 걸 좋아합니다. IT관련 깊이있게 혹은 넓고 얕게라도 지식을 쌓아가고 있는 40대 개발자입니다~

Naver Blog

kubernetes 기본 정리

본 포스트는 정보 공유보다는 제가 공부한걸 저를 위해 정리하는 개념이므로 상세한 설명이 없으니 참고하세요 관련 사이트.- 공식 사이트에 기본 개념이 잘 적혀있습니다. 아래는 그중 서비스 관련 개념 링크입니다. https://kubernetes.io/ko/docs/concepts/services-networking/service/ 서비스 kubernetes.io Service > Pod > Container 순으로 Service 가 Pod 를 관리, Pod 가 Container 를 관리 동일 Pod 내의 1개 이상의 Container 는 동일 ip 주소를 가지므로, localhost 로 서로 통신이 가능하다. Pod 생성시 ip 주소가 할당된다. 동일 클러스터의 다른 container 에서는 기본적으로 다른 Pod의 container 에 접근이 불가하다. 이를 해결해주는게 Service. Service 에는 여러가지가 있으나 ClusterIP 라는 서비스를 생성하면 동일 클러스터내의

Naver Blog

react 기본 문법

제가 react 초보라서 문법 기억하기 위해 쓰는 포스트이니, 설명이나 원리는 없으니 참고하세요. 참고사이트는 react 관련 유명사이트인 아래입니다 https://velopert.com/3613 누구든지 하는 리액트: 초심자를 위한 리액트 핵심 강좌 이 튜토리얼은 리액트를 1도 모르는 사람들을 위해 작성되었습니다. 만약에 여러분이 리액트를 배우고 싶은데, 아직 뭐가 뭔지 잘 모르겠다! 그렇다면 이 튜토리얼을 진행하고 나면 리액트가 무엇인지, 왜 사용하는지, 그리고 어떻게 사용하는지를 알아 갈 수 있을것입니다. 이 튜토리얼은 인프런 에 영상 버전으로도 올라와있습니다. 영상으로 학습하시는것이 편하신분은 인프런에서 수강해주세요~ 목차 1편 리액트는 무엇인가 프론트엔드 라이브러리는 뭐고, 리액트는 뭔지, 어쩌다가 만들어졌고 왜 사용해야 하는지에 대해서 다뤄봅니다. 2편 리액트 프로젝트... velopert.com render() 함수내의 return 안의 것은 모두 JSX 문법이다. ht

1 2 3