hello_world_study의 등록된 링크

 hello_world_study로 등록된 네이버 블로그 포스트 수는 243건입니다.

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 서비스를 실무에서 사용하고 있을 텐데, 이런 기능들도 추가적으로 마이그레이션 할 게 있을 수 있습니다. 다만 이번 포스팅에서는 위에서 언급한 가장 기본적인 기능

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 으로 등록되도록 해주는 작업에

spring boot Binder [내부링크]

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

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

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

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 기본 지식도 함께 다루어 조금 더 깊이 있는 이해를

이케아 옷장, 선반 셀프 조립 [내부링크]

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

e1ad0a1f3cf648bb9c1bf2defbd2e5a3 [내부링크]

e1ad0a1f3cf648bb9c1bf2defbd2e5a3

산정호수 억새꽃축제 명성산 등산 억새바람길 산정리조트 [내부링크]

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

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

리팩토링. 의도와 구현 분리하기. 함수 추출 [내부링크]

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

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

리팩토링. 긴 함수 [내부링크]

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

리팩토링. 매개변수 대신 질의함수를 사용 [내부링크]

매개변수가 있는 함수를 호출시 매개변수에 값을 적절히 넣어주는 것은 호출부의 책임입니다. 너무 많은 파라미터가 있다면, 호출부는 그 파라미터에 적절한 값을 넣어야 하는 부담이 있습니다. 만약 물건 가격 가져오는 함수에서 아래처럼 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;

리팩토링. 조회 및 변경 함수로 분리 [내부링크]

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

리팩토링. 특이케이스 전용 클래스를 만들기 [내부링크]

아래처럼 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();

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

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

spring boot meta annotation 메타 어노테이션 [내부링크]

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

@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

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

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 파일이 만들어지는

ApplicationContext 을 통한 빈 생성 및 조회 [내부링크]

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

정적 팩토리 메서드 뜻과 장단점 [내부링크]

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

빌더 사용할 상황과 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 를 두면 되지 않는가? 라고 생각할 수 있습니다. 물론

싱글턴(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

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)

remind Java. 클래스 초기화 블럭 [내부링크]

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

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

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 라는 물리 디렉토리가 있음을 헷갈리지 않도록 합니다.

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

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 의 서버 및 클라이언트 모듈 설치/설정은 모두 마쳤습니다. 서버와

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 그럼 다음 포스팅부터 본격적으로 달

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

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>

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 가 구동될때 위 클래스가 빈으로 등록되고, 환경변수값

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

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 요청

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

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 에 대해

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() 함수가 실행됩니다.이게 전부입니다. 혼동하지말아야 할게 아

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 클래스로 단순히 이벤트나 데

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() 메서드에 디버그 포인트를 걸고 디

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 을 호출하는 경우 문제 발생 }

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,

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

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

서버 관리자를 위한 network 지식- netstat [내부링크]

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

서버 관리자를 위한 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() 등의 시스

초보자를 위한 HTTPS, SNI, 서버인증서, SSL Proxy [내부링크]

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

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 등

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

심리학으로 풀어보는 리더십 [내부링크]

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

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

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

비전공자를 위한 자료구조 [내부링크]

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

비전공자를 위한 알고리즘 [내부링크]

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

아마존 알렉사 앱 개발 후기(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 를 위한 영어공부용 숫자게임입니다. 자 이제 본론으로 들어가서 어떻게 아마존 알렉사 앱을 개발하면 되는지 살펴봅시다. 큰 그림 위주로 설명을 하겠고, 각 스텝마다 사용된 기술이나 방법은 내용이 방대하여 간략하게

알렉사(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

아마존 alexa(알렉사), ifttt 연동원리에 대해 [내부링크]

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

알렉사 홈 스킬 개발 후기 (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은 뉴스관련 서비스 입니다.) 이번 포스트에서는 사용자 관점의 글이 아니라 개발자 관점의 글입니다. 즉 이미 만들어진 알렉사 홈 스킬을 어떻게 쓰면 되냐? 가 아니라

가상화폐 채굴이 왜 필요한가? why bitcoin mining is needed [내부링크]

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

함수형 프로그래밍과 테스트 주도 개발(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 하였다. 두 가지에 대해 공부를 하다 보니 "어라! 두개가 서로 공통점이 있네!" 라는 생각이 들었다. 공통점은 바로 함수를 모듈화하여 한가지만 수행하는 함수로 만들고, 전역변수와 같은 함수 밖의 상태에 영향을 받지 않는.. 오로지 입력으로 받은 파라메타에만 영향을 받고, 함수 수행결과로 전역변수와 같은 함수 밖의 상태에 영향을 주지 말고, 오로지 리턴값으로만 수행결과가 나오도록 코드를 작성하자.이다. 위의 말은 함수형 프로그래밍에서 자주 듣

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

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

라즈베리파이 설치 및 카메라 모듈 테스트 [내부링크]

아래 서비스를 위한 첫번째 단계를 이제 시작합니다 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

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

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 이라는 디렉토리를 생성합니다. 그런 후 아래처럼 디렉토리를 몇개 만듭니다. 꼭 이럴필요는 없습니다. 일단 그

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

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를 적어

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 /

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

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

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 생성하는 방법을 알아보시죠 ================

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까지 걸리는 시간) 는

AWS 접근권한 설정하기(IAM) [내부링크]

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

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

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

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

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

개발 관련 링크 모음 [내부링크]

아래는 구글링하면서 발견한 괜찮은 블로그들 모음입니다. 몇줄 대충 적어넣거나, 자기만 알아 듣게 적은 곳이 아닌 입문자/초보자에게 도움이 되는 곳입니다. 분야 링크 설명 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:/

'데이터 분석의 힘' 독서 후기 - 1 [내부링크]

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

'데이터 분석의 힘' 독서 후기 - 2 [내부링크]

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

'데이터 분석의 힘' 독서 후기 - 3 [내부링크]

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

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.

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

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

블록체인(blockchain) 정리 - 2 - 블록체인의 필요성 [내부링크]

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

블록체인(blockchain) 정리 - 3 - 블록 상세하게 알아보기 [내부링크]

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

블록체인(blockchain) 정리 - 4 - 블록들의 체인 상세히 알아보기 [내부링크]

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

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() { // 할일

내구성있는 시스템만들기( 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대 이상, 즉 이중화/다중화

우분투에 엘라스틱서치 설치 ( elasticsearch ) [내부링크]

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

엘라스틱서치 환경구성 ( 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

키바나 ( 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 위 사이트에서 다운로드할 이미지의 주소를 복

엘라스틱서치 ( 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%

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

키바나 ( 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

로그분석을 위한 엘라스틱서치 구성 ( = 인덱스 템플릿 ) [내부링크]

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

엘라스틱서치 클러스터 구성하기 ( = 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 위와 같이 클러스터 상태를

"실용주의 프로그래머" 독서 후기 1/2 [내부링크]

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

"실용주의 프로그래머" 독서 후기 2/2 [내부링크]

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

저는 IT 블로거입니다 [내부링크]

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

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 라는 서비스를 생성하면 동일 클러스터내의

react 기본 문법 [내부링크]

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

react - input 처리, 부모 state 갱신 [내부링크]

input 으로 입력 받은 값에 대해 처리하는 방법. 여러개의 input에 대해서도 동일한 핸들러에서 구분해서 처리가능. 객체 만들때 { name: 'kim'} 처럼 하는데 { [name]: 'kim'} 처럼 하면 name 의 값이 title 이라면 결국 { title: 'kim'} 처럼 된다. ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names class App extends Component { state = { name: '', phone: '', } handleChange = (e) => { this.setState({ [e.target.name]: e.target.value // [] 을 사용하면 그 값이 key 가 된다. }) } render() { return ( <form> <input placeholder

react - 배열만큼 component 생성 및 CRUD [내부링크]

배열에 대해 CRUD 시에는 배열의 내부 값을 변경하면 안되고, 새로운 배열을 만들어야 한다. 아래 참조하자. 아래처럼 map 을 이용해서 compoent 배열을 만든 후 그걸 렌더한다. render() { const {bookList} = this.props const bookListArrayDiv = bookList.map( info => ( <Book key={info.id} info={info} removeHandler={this.props.removeHandler} updateHandler={this.props.updateHandler} />) ) return ( <div> {bookListArrayDiv} </div> ) } 값을 추가/삭제할때는 아래처럼 concat 처럼 새로운 배열 만드는 함수 사용하고, 삭제시에는 filter 를 이용한다. this.setState({ bookList: bookList.concat({ id: this.id++, ...data }) })

react - 불필요한 render 방지하여 최적화하기 [내부링크]

아래처럼 shouldComponentUpdate 을 적절히 사용하면 불필요한 render 를 방지하여 성능 최적화를 할 수 있다. 주석 // add 가 이전 포스트에서 추가된 내용이다. import React, { Component } from 'react'; class Book extends Component { state = { isEditing: false, title: '', price: 0 } // 동일 버튼을 수정,적용 이라는 2가지 의미로 쓰다보니 이전값을 trace 해야한다. // 이게 싫으면 수정, 적용 을 따로 버튼 만들고 각자 다른 핸들러를 두면 될듯하다. componentDidUpdate(prevProps, prevState) { const { info, updateHandler } = this.props // 수정버튼 클릭시, props 로 받은 값을 state 에 저장. if ( prevState.isEditing === false && this.state.

react - mobx 기본 [내부링크]

참고사이트 https://velog.io/@velopert/MobX-1-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-9sjltans3p MobX (1) 시작하기 MobX 는 또 다른, 하나의 인기있는 리액트 상태 관리 라이브러리입니다. 저는 MobX 는, 사실상 라이브러리 그 이상의 가치를 하는, 리액트의 개발 흐름 자체를 많이 바꿔주는 강력한 도구라고 생각합니다. "MobX 는 최소한의 공수로 여러분들의 상태관리 시스템을 설계 할 수 있게 해줍니다." The curious case of mobx state tre... velog.io react 안쓰고 javasctipt 만으로 mobx 사용한 상태 관리 하는 예제 @observable : 관찰대상 지정 @computed : 해당 함수 내부에서 접근하는 관찰대상이 변경시 자동으로 호출되어 수행한 후 결과를 저장한다. autorun 과 유사한데 결과를 저장하는게 차이점? 인가? @action: 관찰대상의 값을 변

react - mobx with react [내부링크]

참고 사이트 https://velog.io/@velopert/MobX-2-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-MobX-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-oejltas52z MobX (2) 리액트 프로젝트에서 MobX 사용하기 MobX 는 리액트 종속적이진 않지만, 리액트에서 쓰려고 만들어졌기 때문에 함께 사용하면 엄청난 시너지가 발생합니다. 더 쉬운 글로벌 상태 관리는 물론이고, setState 도 쓸 필요가 없게 됩니다. 2-1. MobX 가 리액트를 만나면 우리가 이전 섹션에서 decorator 문법을 통해서 더 편하게 MobX 를 사용하는 방법을 배웠었는데요, 우리가 ... velog.io ui 에서 사용할 데이터/상태를 스토어에 저장한다. 이를 위해 스토어 new 한 후 그걸 자손에게 넘긴다. // index.js : // 스토어 n

react - Router [내부링크]

react Router 에 대해서는 velopert 글(https://velopert.com/3417)만으로는 이해가 되지 않아 구글링을 해서 이것저것 알아봤고 아래 참고사이트가 제일 괜찮은듯 합니다. 참고사이트 https://beomy.tistory.com/33 [React.JS] 리액트 라우터(react-router v4) react-router react-router는 create-react-app로 react 프로젝트를 생성하여 진행합니다. 1. create-react-app create-react-app 설치는 [React.JS] CodePen, create-react-app으로 React.JS 개발하기 참고 바랍.. beomy.tistory.com 아래 사이트의 기본 환경에 다가 router 의존성을 추가하고 아래 코드를 집어 넣으면 잘 동작합니다. https://codesandbox.io/s/mobx-with-react-hb984 Link to="/abc/xx' : 클릭

selenium 웹 자동화 라이브러리 [내부링크]

#RPA 라고 해서 프로세스 자동화 툴이 인기입니다. 저는 #Automation #Anywhere 라는 상용툴을 써봤는데 웹 브라우저나 exe 프로그램을 로딩하고 특정 메뉴를 클릭하고 화면의 텍스트를 가져와서 엑셀에 저장하고 ... 등등을 설정을 두면, 그 이후부터는 자동으로 실행해주는 것입니다. 코로나 때문에 마스크 대란인데, 매크로 프로그램을 돌려서 자동으로 마스크 구매하는 것도 사실 #RPA 를 통해 할 수 있습니다. 또한 지금 소개하는 무료버전인 #selenium 을 통해서도 가능합니다. #selenium 은 여러가지 언어로 구현체가 있으며 저는 아래 python 으로 구현된 라이브러리 사용법을 소개할까 합니다. https://selenium-python.readthedocs.io/getting-started.html#simple-usage 2. Getting Started — Selenium Python Bindings 2 documentation 2.1. Simple Us

selenium ide . 웹 자동화 툴 소개 [내부링크]

이전 포스트에서 #selenium 이라는 라이브러리를 이용해서 웹 브라우저를 로딩하고 특정 버튼을 클릭하고 등등을 python 코드를 통해 수행하는 걸 봤습니다. 코딩을 모르는 사람에게는 공부할게 좀 있어서 부담스러울 수 있습니다. 상용 #RPA 툴은 대부분 GUI 화면을 통해 드래그/드랍으로 쉽게 자동화 설정을 할수 있습니다. 이에 상응하는 무료 버전으로는 #selenium #ide 라는 게 있습니다. 몇년전까지만 해도 exe 프로그램으로 다운받아야 했으나, 2020년 3월 현재는 크롬 확장프로그램으로 간단히 설치 및 실행을 할 수있습니다. 제가 영상을 녹화해서 아래에 링크를 두었습니다. 여유가 된다면 동영상으로 학습하는게 더 쉽습니다. https://www.youtube.com/watch?v=jqe4MAM3xho https://www.youtube.com/watch?v=7ytRpTCRcgk 저는 간단한 사용법만 동영상으로 소개했으며, 좀 더 다양한 사용법은 아래 링크를 참고하세요

샘플수, 신뢰구간, 신뢰수준의 관계 [내부링크]

TV에서 선거기간 A후보 지지율은 43% +-3% 이며, 신뢰수준은 95% 입니다. 라고 말하는데, 이게 바로, 샘플를 통한 모집단(=실제값)의 값을 추정하는 것이다. 상식적으로 생각했을때, 10명을 조사해서 A후보 지지율을 계산한다면, 40% +-25%이며 신뢰수준은 95% 입니다. 라고 말할수 밖에 없고, 1000명을 조사해서 A후보 지지율을 계산한다면, 40% +-2.5%이며 신뢰수준은 95% 입니다. 라고 말할수 있을 것이다. 즉 동일한 신뢰수준인 95% 로 지지율을 추정(=예상) 하려고 할때, 샘플이 10개 밖에 없으면, 40-25=15%. 40+25=65%. 즉 A 후보의 지지율은 최소 15%, 최대 65% 일것이다.. 라는 식으로 추정구간(=예상구간)을 크게 잡아야 한다. 샘플이 적어서 정확히 예측하기 어려우니, 추정치의 구간을 넓게 잡아서 말할수 밖에 없다. 샘플이 1000개와 같이 많아지면, 좀 더 정확한 예측이 되니, 40-2.5=37.5%, 40+2.5=42.5%

AWS EKS 에서 k8s 클러스터 생성 및 설정 [내부링크]

#kubernetes 줄여서 #k8s 라 부르는 것에 대해서는 인터넷의 다른 자료를 찾아보시고, 저는 aws 의 eks 라는 서비스를 이용해서 간단하게(?) k8s 클러스터 생성 및 kubectl 을 이용해서 pod 생성 등을 하는 방법에 대해 알아보겠습니다. eks 를 사용하면 master node 에 대해서는 aws 가 알아서 생성/관리를 해주기에 app 개발자 입장에서는 k8s 활용법만 알면 되는 편리한 서비스 입니다. - 클러스터 생성 다양한 방법이 있으나 가장 간단한 aws 웹화면(=콘솔)을 통해 클릭 몇번으로 클러스터 생성을 해보겠습니다. 콘솔 화면에서 eks 로 들어가면 클러스터 생성 버튼이 있고, 그곳에 클러스터 이름을 적은 후 생성 버튼을 누릅니다. 생성 완료되는데 10분 가량 걸립니다. 이후 생성완료된 클러스터에서 컴퓨팅 > 노드그룹 추가 를 선택한 후 , 노드로 사용할 이미지를 선택하고, 몇개의 노드로 구성할건지 등을 선택하여 생성시킵니다. 이 또한 10분 가량

spring boot + prometheus + grafana 연동 [내부링크]

아래 3가지를 통해 spring boot 의 cpu, mem, thread count 등의 metric 정보들을 prometheus 에 취합하고, 이를 grafana를 이용해서 시각화하는 방법에 대해 알아보겠습니다. spring boot 에 prometheus 의존성을 추가 prometheus 서버 설치 및 spring boot 주기적 폴링되도록 설정 grafana 설치 및 prometheus 연동하여 시각화 하기 위 연동방법에 대한 포스팅은 쉽게 구글링을 하면 알수 있기에 본 포스트에서는 동영상으로 제공합니다.(제가 녹화한 영상입니다.) 여기서는 동영상에서 사용한 config 정보 등의 text 정보만 나열하겠습니다. application.yml 의 metrics 정보 노출 설정 management: endpoints: web: exposure: include: health, info, prometheus prometheus.yml 의 샘플 설정. ip 정보는 여러분의 spring

confluent platform(=kafka) vs apache kafka [내부링크]

apache kafka 는 kafka 기본(?) 버전이고 confluent platform 은 kafka 패키지 버전이라고 볼수 있습니다. kafka는 원래 링크드인 에서 개발되다가 오픈소스로 공개되었습니다. 링크드인의 개발자 몇몇이 컨플루언트 라는 회사를 창립했고 지금까지 카프카를 발전시키고 있습니다. 오픈소스라서 아무나(?) contribute 는 할수는 있으나 핵심 멤버는 컨플루언트 회사의 멤버들입니다. confluent platform 은 컨플루언트 회사에서 만든 kafka 패키지입니다. 이름에 kafka가 없어서 헷갈릴수 있으나 kafka가 핵심입니다. 즉 confluent platform은 apache kafka + 기타 유용한 서비스/라이브러리 등을 패키지로 묶어 놓은 것입니다. 귀찮게 버전에 맞게 다른 서비스/라이브러리를 설치하지 않아도 되니 confluent kafka 가 편리합니다. 다른것에 비유하자면 python 으로 데이터분석, 머신 러닝을 하려면 아래 2가지

confluent platform(=kafka) 설치 in ubuntu [내부링크]

confluent platform. 즉 카프카 패키지를 우분투에 설치하는 방법에 대해 알아보겠습니다. confluent platform 은 apache kafka 와 유사한데 ,차이점은 아래 링크를 참고하세요. https://blog.naver.com/semtul79/222067253987 confluent platform(=kafka) vs apache kafka apache kafka 는 kafka 기본(?) 버전이고confluent platform 은 kafka 패키지 버전이라고 볼수 있습니다.... blog.naver.com 저는 AWS의 EC2 서비스를 이용해서 ubuntu 18 을 하나 할당받은 후 그곳에 confluent platform 을 설치하고, 하나의 EC2 에 zookeeper 와 kafka 를 모두 설치/연결 하여 stand alone 으로 구동되도록 하겠습니다. 공식 설치방법은 아래 링크에 있습니다. https://docs.confluent.io/curren

kafka cluster 구성 #1/2 ( confluent platform 클러스터) [내부링크]

이전 시간에 아래처럼 하나의 리눅스에 zookeeper 와 kafka 를 설치하는 구성을 알아봤습니다. https://blog.naver.com/semtul79/222067309498 confluent platform 설치 in ubuntu confluent platform. 즉 카프카 패키지를 우분투에 설치하는 방법에 대해 알아보겠습니다.confluent plat... blog.naver.com 이제는 여러대의 서버에 zookeeper 와 kafka 를 구성하는 방법에 대해 알아보겠습니다. apache kafka 의 패키지 버전인 confluent platform 을 이용하며, 이전 시간과 동일하게 AWS EC2 ubuntu 를 기본 OS 로 이용합니다. standalone 구성과 동일하게 kafka, java 등은 설치해야 하므로, 동일하게 아래 명령을 수행해줍니다. wget -qO - https://packages.confluent.io/deb/5.5/archive.key |

kafka cluster 구성 #2/2 ( confluent platform 클러스터) [내부링크]

이전 포스팅에서 zookeeper 설치 및 구동을 했습니다. https://blog.naver.com/semtul79/222067335680 kafka cluster 구성 #1/2 ( confluent platform 클러스터) 이전 시간에 아래처럼 하나의 리눅스에 zookeeper 와 kafka 를 설치하는 구성을 알아봤습니다. https://blo... blog.naver.com 이제는 kafka 2대를 설치 하고 , 위 포스팅에서 구성한 zookeeper 에 연결해보겠습니다. cpu, mem가 많이 필요한건 아니지만 cpu:1, mem:1G 처럼 너무 작게 해두면 카프카 서버가 구동자체가 되지 않습니다. 이것때문에 한시간을 삽질했네요 ㅡㅜ. 암튼 저는 cpu:2, mem: 4GB 로 설정한 서버로 테스트하였습니다. 이전과 동일하게 기본적으로 java 와 confluent platform 은 설치해야 하므로 아래처럼 설치를 합니다. wget -qO - https://package

[후기] 한샘 조이S 화이트 5단 LITE매직데스크 set [내부링크]

학생용 책상은 일룸 vs 한샘 둘 뿐입니다. 저는 초등학생 1,3 학년용 책상을 사야 했기에, 아래 기능이 필요했습니다. 각도조절 - 필수 : 올바른 자세에 도움됨 높이조절 - 불필요: 5,6세에 적합. 초등부터는 불필요. 내장조명: 15만원 가량되기에 가성비가 안나옴. 그냥 스탠드 별도 구매가 적합. 온라인에는 온라인 전용 제품이 있기에 아무래도 조금 더 저렴하나 좀 더 최신제품이나 예쁜것은 오프라인에만 팔거나 오프라인과 동일한 가격으로 온라인에 팝니다. 따라서 일단 매장에서 직접 보는걸 추천드리며 저는 한샘 매장에서 상담 후 구매했습니다. 행사기간이어서 핸드블랜더 사은품 + 16만원할인 하여 책상 2set 로 총 150만원 가량으로 구매했습니다. 위 내용으로 2020.08 시점의 가격을 참고하세요 매장에서는 의자도 권유했으나 15만원 가량이면서도 기능도 별로고 예쁘지도 않았습니다. 미리 인터넷으로 알아본 시디즈 링고 의자가 15만원정도 해서, 의자는 인터넷으로 구매했습니다. 한

AWS MSK를 이용한 카프카 클러스터 구성 [내부링크]

#AWS 에서는 이미 #kafka 유사 기능인 #kinesis 라는 것이 있습니다. 최근에는 이외에도 kafka 자체를 서비스로 제공합니다. 이것이 바로 AWS MSK(Amazon Managed Streaming for Apache Kafka) 입니다. 아래처럼 이전 포스팅에서 kafka 를 직접 설치했었는데, standalone 이 아닌 클러스터 환경. 즉 주키퍼 여러대, 카프카 여러대를 하나로 묶어서 환경을 만들 경우 주키퍼, 카프카 properties 파일 등을 적절히 수정해야 하고 지속적으로 관리해야 합니다. https://blog.naver.com/semtul79/222067309498 confluent platform 설치 in ubuntu confluent platform. 즉 카프카 패키지를 우분투에 설치하는 방법에 대해 알아보겠습니다.confluent plat... blog.naver.com 많은 기업들이 public cloud 를 선택하는 이유중의 하나가 전문인력부

kafka topic 생성/조회 in python [내부링크]

지난 포스팅에서 구성한 AWS MSK . 즉 카프카 클러스터에 토픽 생성 및 조회를 python 으로 작성해보겠습니다. 우선 AWS MSK는 public endpoint를 제공하지 않습니다. 즉 동일 vpc 내에서만 접근 가능하기에 동일 vpc 내의 EC2 인스턴스를 하나 만든 후 그곳에 python, kafka 라이브러리 등을 설치해서 접근하겠습니다. 우선 python을 설치합니다. 저는 jupyter notebook 으로 코드 작성을 할 예정이므로 anaconda 를 이용해서 한방에 설치를 했습니다. ubuntu@ip-172-31-6-168:~$ wget https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh --2020-08-22 22:36:44-- https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh Resolving repo.anaconda.

kafka producer, consumer in python [내부링크]

지난 포스팅에서 kafka 토픽 생성/조회를 python 으로 해봤습니다. 이젠 메시지를 전송하고(=producer ), 메시지를 수신하는(=consumer)를 python으로 작성해보겠습니다. producer 코드는 아래와 같습니다. from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers='b-1.demo-cluster-1.09mf2p.c4.kafka.ap-northeast-2.amazonaws.com:9092,b-2.demo-cluster-1.09mf2p.c4.kafka.ap-northeast-2.amazonaws.com:9092') for i in range(1,11): msg = '{}-msg'.format(i) producer.send('example_topic', str.encode(msg)) consumer 코드는 아래와 같습니다. from kafka import KafkaConsumer c

about consumer group , rebalance in kafka [내부링크]

kafka 에는 producer 와 consumer 라는 생산자와 소비자 개념이 있는데 producer 는 아무나 send 하면 되는데 consumer 는 신경쓸게 좀 있습니다. A 라는 토픽에 대해 consumer 2대가 있다고 합시다. consumer 2대가 서로 상관없는 consumer 라면 A 토픽에 있는 이벤트 10개를 각각 10개씩 수신하면 되겠죠... 그러나, consumer 2대가 사실 동일 서비스이고 이중화때문에 2대가 구동중인거라고 해봅시다. 보통 운영환경에서는 이렇게 2대 이상 동일 서비스가 구동되지요. 일반적으로 이 상황에서는 10개의 이벤트중 5개 정도는 1번 서버가 수신을 하고, 나머지 5개 정도의 이벤트를 2번 서버가 수신하기를 원할겁니다. 이를 위해서는 2대의 서버가 "우린 같은 거라고 봐주세요" 라는 식으로 뭔가 설정을 해줘야 합니다. 이게 바로 consumer group 입니다. 이렇게 동일 consumer group 으로 묶인 2대 이상의 서버들이

azure vs aws , 서비스별 매핑 [내부링크]

클라우드중 제일 유명한 것이 #AWS 이지요. 저도 #AWS 를 자주 사용했는데, MS 의 #azure 에 대해서도 알아봤습니다. 우선 아래처럼 azure 에서 제공하는 서비스들은 아래 그림과 같습니다. 시간이 흐를수록 새로운 서비스가 생겨나니 이것만 있다고 보지는 마세요. 아래 링크를 통해 AWS 서비스 와 azure 서비스 매핑을 확인 할 수 있습니다. https://docs.microsoft.com/en-in/azure/architecture/aws-professional/services AWS to Azure services comparison - Azure Architecture Center Compare Azure cloud services to Amazon Web Services (AWS) for multicloud solutions or migration to Azure. docs.microsoft.com 다음 시간에는 대표적인 서비스들에 대해 #AWS 와 #AZURE

MS Azure CLI 설치 [내부링크]

* 선행작업: MS Azure 에 가입하여 무료 or 유료로 azure 의 서비스를 사용할수 있는 계정 생성 및 소유. azure 최초 가입시 무료로 얼마간 사용할수 있습니다. 가장 기본이 되는거라 구글에서 "azure 계정 생성" 과 같이 검색하면 쉽게 찾을수 있습니다. #Azure 에 앱을 배포하거나 환경 설정을 하거나 등등의 작업은 크게 1. https://portal.azure.com/ 사이트에 로그인한 후 마우스로 원하는 서비스를 클릭하고 값을 설정해서 실행 하거나 2. azure cli 를 window, linux 등에 설치한 후 해당 cli 명령어로 실행하는 방법이 있습니다. 아무것도 모를때는 웹화면으로 제공되는 https://portal.azure.com/ 가 편하겠으나, 100% 모든 것을 웹화면에서 제공하는건 아니고 ( e.g. 함수 앱(=서버리스 컴퓨팅 서비스)에서 linux 기반 python 런타임은 웹화면에서 상세 설정 지원 안함 ), 자동화 등을 하려면 cl

docker 기본 사용법 - 실행 [내부링크]

k8s 를 공부하려면 우선 docker 를 알아야 합니다. k8s는 docker 를 이용해서 container들을 배포하며 이를 조율하는 것이기 때문이죠. container 의 구현체로는 docker 외에도 많이 있으나 대세는 docker 입니다. 자 이제 docker 사용법을 알아보시죠. 보통 docker 명령은 root 권한이 필요하기에 sudo docker run XXX 처럼 앞에 sudo 를 넣어서 실행해야 합니다. 본 포스팅에서는 sudo는 생략해서 적혀있으니 각자 환경에 맞게 sudo 를 적절히 넣어서 실행하세요 docker가 리눅스에 설치되었다는 가정하에 아래처럼 docker run <이미지이름> 을 실행하면 이미지이름 을 검색해서, 현재 호스트에 해당 이미지가 있으면 그걸 바로 실행시켜주고, 없으면 이미지 저장소(docker hub 라고 부릅니다.)에서 다운받은 후 현재 호스트에서 실행을 해줍니다. docker run hello-world hello-world 라는 이

docker 기본 사용법 - 빌드 [내부링크]

이전 시간에는 누군가가 이미 만들어서 docker hub 에 올려놓은 이미지를 다운받아 실행하는 법에 대해 알아봤습니다. 이제는 나만의 docker 이미지를 만드는 방법에 대해 알아봅시다. 아래는 현재 포스팅의 영상버전입니다. https://youtu.be/2DbtXr8VyJk 크게 아래와 같은 단계를 거칩니다. 1. Dockerfile 이라는 이름의 파일에 docker 이미지 문법에 맞게 설정을 함 2. docker build 명령으로 작성한 Dockerfile 에 맞는 이미지 생성 vi 에디터 등을 이용해서 Dockerfile 이라는 이름의 파일을 만들고 아래와 같이 입력을 합니다. # 부모 이미지의 이름을 FROM에 기입합니다. 여기서는 node 이밎의 tag 6 을 부모 이미지로 선택 FROM node:6 # 도커내에서 특정 서버프로그램을 실행할것이므로, 작업할 디렉토리를 지정합니다. WORKDIR /app # 빌드할 서버에 있는 일부 파일을 도커 이미지로 복사하는 명령. #

[입문] azure (애저) 비용 (사용요금) 확인하는 법(Azure cost management) [내부링크]

Azure 처음 가입하면 몇달간은 공짜로 쓸수 있으나 결국 쓴만큼 돈을 내게 되어있습니다. 이번 포스팅에서는 지금 현재 얼마나 비용을 쓰고 있는지 확인하는 방법에 대해 알아보겠습니다. 본 포스팅의 영상버전은 아래와 같습니다. 태그를 활용하는 방법, 태그를 강제하는 정책(#policy) 생성하는 법 등 본 포스팅 보다 더 많은 정보가 들어있습니다. https://youtu.be/0s_G004nhlw 아래처럼 azure portal에 로그인 한 후 cost management 라고 검색을 해서 해당 메뉴로 들어갑니다. 저는 무료체험용 subscription이 있었다가 시간이 지나 사용불가가 되었고, 현재는 Pay as you go 즉 쓴만큼 내는 subscription(=구독)을 사용중입니다. 지금 현재 6700원 정도 썼다고 나오네요. 자세한 내역을 알기 위해 파란색으로 표시되는 금액을 클릭합니다. 아래처럼 기본화면이 나옵니다. 도넛모양 그래프를 보면 서비스별, 리전별 금액이 나옵니다

[입문] azure function app 의 도메인을 변경하는 법(how to set custom domain in azure function application) [내부링크]

이번 포스팅에서는 azure 의 function app 의 도메인 주소를 자신의 것(개인 도메인 or 회사 도메인)으로 변경하는 방법에 대해 알아보겠습니다. -------------------------------------------------------------------- 본 포스팅의 영상 버전은 아래와 같습니다. 화면 조작이 많기에 영상 버전을 추천합니다. https://youtu.be/TM4AhI3ds_4 -------------------------------------------------------------------- function app의 http trigger 를 만들면 xxx.azurewebsites.net 처럼 azure 에서 기본으로 제공해주는 도메인으로 호출이 가능합니다. 테스트용이야 상관없으나, 회사에서 정식으로 제공하는 REST API 서비스를 azure function으로 만들었는데, REST API 의 도메인주소가 azurewebsites.ne

[입문] custom domain용 도메인 인증서 발급방법(how to create certificate for custom domain in azure) [내부링크]

아래의 지난 포스팅에서 custom domain 매핑 방법에 대해 알아봤습니다. https://blog.naver.com/semtul79/222337913330 [입문] azure function app 의 도메인을 변경하는 법(how to set custom domain in azure function application) 이번 포스팅에서는 azure 의 function app 의 도메인 주소를 자신의 것(개인 도메인 or 회사 도메인)으로 ... blog.naver.com 다 잘 되나, https 로 접속시 인증서가 custom domain용이 아닌 애저에서 제공해주는 도메인에 대한 인증서라서 웹브라우저에서 경고창이 나왔습니다. 이걸 해결해보도록 하겠습니다. --------------------------------------------------------- 본 포스트의 영상버전은 아래와 같습니다. 화면 조작이 많기에 영상버전을 추천합니다. https://youtu.be/2A

[입문] azure key vault 사용하는 법(how to use Azure key vault) [내부링크]

DB 접속용 id, pw 나 암복호화용 key 값, 인증서 등 보안 관련된 값들을 저장하고 관리해주는 Azure key vault 에 대해 알아보겠습니다. ================================== 아래는 본 포스팅의 영상버전입니다. 화면조작이 많기에 영상시청을 권장합니다. https://youtu.be/Ifj_f1HOkLc ================================= portal.azure.com 에 로그인 한 후 상단 검색창에 key vault 라고 검색해서 서비스를 실행시킵니다. 이후 아래 화면에서 + new 를 눌러줍니다. 이후 아래처럼 리소스 그룹을 하나 선택해주고, key vault name에 적당한 값을 넣어줍니다. 이 name값을 기반으로 key vault에 접근할 수 있는 url 이 만들어지므로 test <-- 이런식으로 다른 사람이 이미 만들었을법한 흔한 이름은 쓸 수 없습니다. soft delete 는 휴지통 같은 개념이며, d

[입문] azure function에서 key vault 접근하는 법#1(how to access Azure key vault in azure function) [내부링크]

아래의 지난 포스팅에서 azure key vault 서비스를 이용해서 비밀스러운 key,value 쌍을 저장하는 법을 알아봤습니다. 이번에는 azure funtion 에서 지난번에 만든 key,value 쌍에 접근해서 값을 읽어오는 법에 대해 알아보겠습니다. 사실 이번 포스팅의 내용까지 알아야 key vault 를 활용할 수 있게 되는 셈입니다. https://blog.naver.com/semtul79/222340771870 [입문] azure 에서 key vault 사용하는 법(how to use Azure key vault) DB 접속용 id, pw 나 암복호화용 key 값, 인증서 등 보안 관련된 값들을 저장하고 관리해주는 Azure key... blog.naver.com azure 에서 function 만드는 법은 아래 포스트를 참고해서 하나 만들면 됩니다. function은 잘 만들었다 가정하고 필요한 내용만 기술하겠습니다. https://blog.naver.com/semt

[입문] azure function에서 key vault 접근하는 법#2(how to access Azure key vault in azure function) [내부링크]

아래 포스팅을 통해 권한 세팅은 마쳤습니다. 이제 실제 소스코드를 통해 key vault 에 접근해보겠습니다. https://blog.naver.com/semtul79/222342113721 [입문] azure function에서 key vault 접근하는 법#1(how to access Azure key vault in azure function) 아래의 지난 포스팅에서 azure key vault 서비스를 이용해서 비밀스러운 key,value 쌍을 저장하는 법을 알... blog.naver.com ============================================== 아래는 본 포스팅의 영상버전입니다. 화면조작이 많기에 영상시청을 권장합니다. https://youtu.be/9AaM12B73gM =================================================== 현재 만든 azure function은 아래와 같은 설정이 되어 있고, hostin

[입문] azure 가상머신(virtual machine) 만드는 법 - linux ( how to create virtual machine in azure ) [내부링크]

#cloud 의 가장 기본적인 서비스 중의 하나인 #virtual #machine ( #vm 이라고 줄여서 쓰죠) 만드는 법에 대해 알아보겠습니다. azure portal 화면에서 virtual machine 이라고 검색해서 virtual machine 서비스로 이동합니다. 이후 +add 버튼을 눌러서 추가를 누릅니다. 이후 아래처럼 resource group 을 적절히 선택하고(저는 test 라는 리소스그룹이 있기에 그걸 사용했습니다) 적당한 이름을 입력합니다.(저는 developery-vm 이라고 적었습니다.) image 에는 linux, windows 를 선택할수 있습니다. linux 그중에서도 ubuntu 를 선택했습니다. 선호하는 다른 리눅스 OS가 있다면 그걸 선택해도 됩니다. size 에는 제일 저렴한 1 core, 0.5 GB memory 를 선택했습니다. 저는 단순 테스트용이므로 저렴이를 선택했지만, 만약 이것저것 프로그램 설치해서 사용할 것이면 보다 큰 메모리를 가

[입문] azure 가상머신(virtual machine) 만드는 법 - windows 10 ( how to create virtual machine in azure ) [내부링크]

이전 포스팅에서 #azure #virtual #machine 서비스를 이용해서 #ubuntu 리눅스를 만들고 #nginx 웹서버 설치 및 구동 까지 해보았습니다. 이번에는 windows 10 pro 즉 windows 데스크탑을 vm 을 이용해서 만들고 사용해 보겠습니다. linux 용 vm 만드는 것과 유사한 부분이 많기에 다른 부분만 중점적으로 설명하겠으니, 우선 아래 포스트를 익히길 권장드립니다. https://blog.naver.com/semtul79/222343860219 [입문] azure 가상머신(virtual machine) 만드는 법 - linux ( how to create virtual machine in azure ) #cloud 의 가장 기본적인 서비스 중의 하나인 #virtual #machine ( #vm 이라고 줄여서 쓰죠) 만드는 법에 ... blog.naver.com 검색창에 virtual machine 이라고 검색해서 가상 머신 서비스로 들어간 후 아래

spring boot initializr 를 통해 프로젝트 파일 생성하는 법 [내부링크]

본 포스트의 영상버전은 아래와 같습니다. https://youtu.be/E5pTYYLNgQo spring boot 프로젝트를 만드는 방법은 다양하며, 주로 1. eclipse와 같은 IDE 에서 spring boot 프로젝트 생성메뉴를 통해 템플릿 프로젝트를 만들거나 2. https://start.spring.io/ <-- 이곳에서 템플릿 프로젝트를 만들고 다운로드 한후 eclipse와 같은 IDE 에서 import 해서 만듭니다. Spring Initializr Initializr generates spring boot project with just what you need to start quickly! start.spring.io 이번 포스팅에서는 #spring #boot #initialzr 사이트를 통해 만드는 방법에 대해 알아보겠습니다. 우선 아래 사이트를 크롬등을 통해 들어갑니다. https://start.spring.io/ 그러면 아래와 유사한 화면이 나옵니다. spr

ubuntu 에서 spring boot 빌드/구동하는 법 [내부링크]

이전 포스팅에서는 windows 에서 eclipse 환경하에서 spring boot initializr 를 통해 spring boot 프로젝트 생성 및 빌드/구동하는 것에 대해 알아봤습니다. (아래 링크 참조) https://blog.naver.com/semtul79/222359288073 spring boot initializr 를 통해 프로젝트 파일 생성하는 법 spring boot 프로젝트를 만드는 방법은 다양하며, 주로 1. eclipse와 같은 IDE 에서 spring boot 프로젝... blog.naver.com 이번에는 ubuntu linux 에서 spring boot initializr 를 통해 spring boot 소스를 만들고, 빌드 및 구동 / 테스트 하는 법에 대해 알아보겠습니다. 우선 ubuntu linux 가 필요한데, 저는 #클라우드 서비스중의 하나인 #azure 를 이용해서 #virtual #machine 을 만들고, 그곳에 java 등을 설치해서 구동

[입문] azure 가상머신(virtual machine) 에서 방화벽(firewall) 설정방법 [내부링크]

아래와 같이 linux 가상머신을 만들면 일반적으로 22번(SSH) 포트만 열려져 있습니다. 웹서버 등을 구동한다면 80, 8080 등과 같이 다양한 포트가 외부에 열려있어야 하는데 이에 대한 방법을 알아보겠습니다. https://blog.naver.com/semtul79/222343860219 [입문] azure 가상머신(virtual machine) 만드는 법 - linux ( how to create virtual machine in azure ) #cloud 의 가장 기본적인 서비스 중의 하나인 #virtual #machine ( #vm 이라고 줄여서 쓰죠) 만드는 법에 ... blog.naver.com 가상 머신을 만든 후 아래처럼 Settings > Networking 을 누릅니다. 그러면 아래처럼 inbound, outbound 에 대한 현재 방화벽 설정이 보입니다. 위 그림을 보면 inbound 탭에서 SSH 22번 포트가 allow 되어 있음을 알수있습니다. inbo

ubuntu docker 설치(how to install docker in ubuntu linux) [내부링크]

ubuntu linux 에 docker 설치하는 방법에 대해 알아보겠습니다. 아래 공식 문서를 참고하여 진행했으며, #azure #virtual #machine 으로 #ubuntu 를 이용했습니다. (Ubuntu 18.04.5 LTS) https://docs.docker.com/engine/install/ubuntu/ Install Docker Engine on Ubuntu Instructions for installing Docker Engine on Ubuntu docs.docker.com 일반적으로 프로그램 설치시 apt-get install XXX 이라고만 하면 설치가 되는데, docker 의 경우 암호화 관련 설정 등등 미리 할게 많습니다. 공식 가이드에 나온대로 일단 시키는대로 명령 수행하면 설치가 되니, 각각의 명령어가 뭘 뜻하는지 정확히 몰라도 너무 걱정하지 마세요. 자 시작합시다. ubuntu 에 로그인 한 후 우선 아래처럼 예전 버전이 남아있을지 모르니 삭제를 해줍

docker hub 에 docker image push 하는 법 [내부링크]

아래 포스팅을 통해 docker image를 생성했다고 가정했을때, docker hub 에 image 를 push 해서 다른 사람에게 공유하는 방법에 대해 알아보겠습니다. https://blog.naver.com/semtul79/222138570438 docker 기본 사용법 - 빌드 이전 시간에는 누군가가 이미 만들어서 docker hub 에 올려놓은 이미지를 다운받아 실행하는 법에 대해 알... blog.naver.com docker hub는 git hub ( https://github.com/ )와 유사한 개념입니다. GitHub: Where the world builds software GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review cod

[입문] azure container registries (ACR) docker image push 하는 법 [내부링크]

docker image 를 docker hub 에 push 하는 법은 아래 포스팅으로 설명하였습니다. 이번에는 #azure 에서 제공하는 #docker #image 저장소인 #ACR 즉 #Azure #Container #Registries 에 push 하는 법에 대해 알아 보겠습니다. 기본적인 docker image 빌드, push 사용법은 아래 링크로 익혔다는 가정에서 #ACR 에 대한 부분만 설명합니다. https://blog.naver.com/semtul79/222361178993 docker hub 에 docker image push 하는 법 아래 포스팅을 통해 docker image를 생성했다고 가정했을때, docker hub 에 image 를 push 해서 다른 사람... blog.naver.com 아래는 본 포스팅의 영상 버전입니다. https://youtu.be/FYBWfqW2mAg https://youtu.be/1v2cuYJVRHI azure portal 에 로그인한

GitHub - docker hub 연동하여 automated builds 하는 법 [내부링크]

docker hub 에 docker image push 하는건 알았는데, 매번 docker image 빌드하고 push 하는게 귀찮다 라고 느껴지는 분들을 위한 포스팅입니다. docker hub 기본 사용법 등은 아래 포스팅을 참고하세요. https://blog.naver.com/semtul79/222361178993 docker hub 에 docker image push 하는 법 아래 포스팅을 통해 docker image를 생성했다고 가정했을때, docker hub 에 image 를 push 해서 다른 사람... blog.naver.com 아래부터는 Dockerfile 만드는 법, git 사용법, GitHub 기본 사용법은 알고 있다는 가정하에 진행됩니다. 컴파일 과정을 생략하기 위해, 스크립트 언어인 javascript ( node.js ) 로 서버를 만들었습니다 우선 GitHub 에 repository를 만들고 그곳에 Dockerfile 과 app.js 를 push 해 줍니다.

오늘도 달린다 [내부링크]

영어 수학 같은 기본 학문은 한번 배우면 평생 써먹는데 IT는 매년 공부하지 않으면 뒤쳐지는 느낌이다. 오늘도 달린다. 어제도 달렸는데..내일도 달려야하네 ㅡㅜ #오늘일기 #블챌

azure 자격증 공부중 [내부링크]

AZ-900과 AZ-204 를 취득했고 AZ-400 을 공부중. 시험 dump를 보면 20% 정도 문제가 어렵게 꼬아놓아서 내용을 알아도 답을 맞추지 못하겠다. 회사서 취득하면 당근을 준다고 하니 어느정도 시험을 위한 공부이지만 하는중. 아참 시험후기가 궁금하면 아래를 클릭~ https://blog.naver.com/semtul79/222289352710 azure 자격증 시험 후기 - fundamentals (AZ-900) 오늘 아침 #azure 자격증 시험을 집에서 온라인으로 봤고 이에 대한 후기를 남깁니다. 가장 쉽고 기본적인 ... blog.naver.com https://blog.naver.com/semtul79/222329164319 azure 자격증 시험 후기 - Developer Associate (AZ-204) AZ-900 시험을 보고난 후 약 한달후에 별2개짜리인 AZ-204 즉 #Developer #Associate 시험을 봤습니... blog.naver.com

azure 시험 하루전 [내부링크]

#az-#400 시험 하루전. 시간이 없다. 모르겠는건 그냥 외워야함. 어서 합격하고 편하게 제대로 공부하자. 내일 #블챌 #오늘일기 는 az-400 시험후기다. ㅎㅎ

재테크 [내부링크]

노동으로 종자돈을 모으고 그걸로 불로소득이 되는 부동산 주식 등을 하라 불로소득 안좋게만 봤는데 도박만 아니면 해야한다고 생각이 바뀌었다 #블챌 #오늘일기

azure 자격증 시험 후기 - DevOps Engineer (AZ-400) [내부링크]

어제 밤에 AZ-400 DevOps Engineer Expert 자격증 시험을 쳤습니다. 1000점 만점에 881점으로 합격했네요 ( 700점 이상 합격 ) dump는 기존과 동일하게 아래 사이트를 통해 공부했습니다. https://www.examtopics.com/exams/microsoft/az-400/view/ AZ-400 Exam – Free Actual Q&As, Page 1 | ExamTopics Custom View Settings Topic 1 - Question Set 1 Question #1 Topic 1 Your company plans to use an agile approach to software development. You need to recommend an application to provide communication between members of the development team who work in locations around the

[입문] spring boot 에서 azure(애저) 사용 ( how to access azure in spring boot ) [내부링크]

#Azure 의 여러 resouce 를 write, read 등의 access 를 하는 방법은 많이 있습니다. 가장 편한건 azure portal 을 이용해서 리소스를 만들고 접근하는 방법입니다. 이건 입문자에게 맞으나, 결국 #python , #java 처럼 프로그래밍 언어를 이용해서 애저 리소스에 접근해야 합니다. 그중 java 의 유명한 웹 프레임워크인 #spring #boot 에서 애저 리소스에 접근하는 방법하는 방법에 대해 알아보겠습니다. azure resource 에는 DB, VM, serverless 등등 종류별로 너무 많기에 여기서 하나씩 다루지는 않겠고 아래 공식 문서를 소개하는 것으로 간략히 소개하고자 합니다. https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/spring-boot-starters-for-azure Spring Boot Starters for Azure This articl

GitHub 기본 사용법 [내부링크]

git repository 생성등을 지원해 주는 서비스에는 github, gitlab, bitbucket 등 다양하게 있으며 그중 무료(유료버전도 있긴함)이며 가장 많이 쓰는 github 에 대해 간략히 알아보겠습니다. 본 포스팅의 영상버전은 아래와 같습니다. https://youtu.be/AKkj66OgpUc 우선 아래 사이트로 이동해서 회원가입을 해줘야 합니다. 일반적인 회원가입이니 적당히 입력해서 가입을 해줍니다. https://github.com/ GitHub: Where the world builds software GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat... gi

[입문] azure(애저) app services - 생성 [내부링크]

#azure 에서 #web #app 을 가장(?) 쉽게 배포할 수 있는 방법중의 하나인 #app #services 생성방법에 대해 알아보겠습니다. 본 포스팅의 영상버전은 아래와 같습니다. https://youtu.be/JjPRFaLnMbM https://youtu.be/bMvBgcH7Ndk 우선 azure portal에 로그인 한 후 아래처럼 검색창에 app services 라고 검색하여 해당 서비스로 이동합니다. 이후 resource group 를 적당히 선택하고 인스턴스 이름에 나만의 이름을 넣어줍니다. 저는 java 8 , spring boot 를 사용할 것이므로 아래처럼 세팅을 했습니다. sku and size 에는 테스트 용도라서 저렴이로 선택했습니다. 이후 생성버튼을 눌러 생성시켜줍니다. 인스턴스 이름쪽에 보면 .azurewebsites.net 이라고 뒤에 붙어 있습니다. #azure #function 처럼 이것도 도메인이 자동 할당되어 지네요. 그리고 도메인에 쓰일 이름

[입문] azure(애저) app services - gitHub 연동 배포(deployment) [내부링크]

아래 포스팅을 통해 app service 를 생성했습니다. https://blog.naver.com/semtul79/222377778689 [입문] azure(애저) app services - 생성 #azure 에서 #web #app 을 가장(?) 쉽게 배포할 수 있는 방법중의 하나인 #app #services 생성방법에 대해 ... blog.naver.com 이제 소스코드를 연결시키고 배포를 해야 합니다. 소스코드는 #GitHub 를 이용하며 app service 에서 #GitHub 연동하여 github 에 소스코드가 push될때마다 자동 빌드 및 app service 로 배포 되도록 해보겠습니다. 본 포스팅의 영상버전은 아래와 같습니다. https://youtu.be/JjPRFaLnMbM https://youtu.be/bMvBgcH7Ndk 우선 gitHub 계정과 repository 를 만들고 spring boot 소스를 push 하겠습니다. ( java/spring boot 대

[입문] azure(애저) devOps(데브옵스) 기본 사용법 [내부링크]

#azure ( #애저 )에서 제공하는 #devOps ( #데브옵스 ) 에 대해 간략히 알아보겠습니다. 일반적으로 portal.azure.com 포털을 통해 #VM 이나 #DB 등을 관리할 수 있는데 devOps 의 경우 별도 도메인이 존재합니다. dev.azure.com 을 브라우저에 입력합니다. 그리고 나서 로그인을 하면, 아래처럼 organization ( 조직 ) 을 입력하라고 나옵니다. 보통 dev ops 가 조직단위로 운영되므로 조직이 하나도 없다면 하나라도 추가하라고 나오는겁니다. 하나라도 추가했다면, 이후부터는 아래 팝업이 나오지 않습니다. 조직 추가가 완료되면 아래처럼 project 추가하라고 나옵니다. ( 자꾸 추가하라고 나오는건 맨 처음 접속시에만 나옵니다. 하나라도 추가하면 더 이상 나오지 않습니다. ) 조직마다 여러개의 프로젝트가 개발/운영 되므로 프로젝트가 최소 1개는 있어야 할테니, 뭐 이상하지 않습니다. 저는 아래처럼 developery-prj 라고 프로

블챌 마지막 [내부링크]

거의 매일 블로그 포스팅을 하지만, 블챌 때문에 매일 의무적으로 쓰니 참 어렵네요. 오늘이 블챌 마지막이라니 너무 좋습니다. 뭐든 자발적 주도적일때가 제일 좋네요 ㅎㅎ 한시간 야근하면 만원보다 더 버는데 블챌이 뭐라고 이게 더 힘드네요 ㅜ

[입문] azure(애저) devOps 에서 애자일(agile) Boards 사용법#1 [내부링크]

#azure #devops 를 통해 #애자일 ( #agile ) 프로세스 board 생성 및 사용법에 대해 알아보겠습니다. 우선 아래 포스팅을 통해 devops 로그인과 organization (조직)을 만들었다고 가정하겠습니다. https://blog.naver.com/semtul79/222379571864 [입문] azure(애저) devOps(데브옵스) 기본 사용법 #azure ( #애저 )에서 제공하는 #devOps ( #데브옵스 ) 에 대해 간략히 알아보겠습니다. 일반적으로 porta... blog.naver.com 대부분이 UI 사용법이므로 글보다는 영상이 이해하기 편합니다. 아래 영상을 추천합니다. https://youtu.be/KojDPrSdKAk https://youtu.be/7i413sKQFhs https://youtu.be/I3pSNnatNew https://youtu.be/iyoFdlx76kM 애자일 프로젝트를 만들기 위해 아래처럼 + new project 를

[입문] azure(애저) devOps 에서 애자일(agile) Boards 사용법#2 [내부링크]

아래 포스팅에 이어 query와 dashboard 에 대해 알아보겠습니다. https://blog.naver.com/semtul79/222388672163 [입문] azure(애저) devOps 에서 애자일(agile) Boards 사용법#1 #azure #devops 를 통해 #애자일 ( #agile ) 프로세스 board 생성 및 사용법에 대해 알아보겠습니다. 우선 ... blog.naver.com 영상버전은 아래와 같습니다. https://youtu.be/KojDPrSdKAk https://youtu.be/7i413sKQFhs https://youtu.be/I3pSNnatNew https://youtu.be/iyoFdlx76kM 아래처럼 query를 선택하고 + new query를 선택해줍니다. 이후 아래와 같은 기본 화면이 나오며 저는 Assigned to 조건을 하나더 넣었습니다. value에 @me 라고 넣으면 현재 접속한 계정 을 뜻하게 됩니다. 이 말은 query를 만

[입문] azure 에서 jenkins 서버 생성 및 maven설정 ( 애저에서 젠킨스 서버 생성 및 세팅 ) [내부링크]

#azure ( #애저 ) #jenkins ( #젠킨스 ) 서버 생성 및 java 빌드를 위해 #maven 설치 하는 방법에 대해 알아보겠습니다. 아래처럼 portal 에서 + Create a resource 버튼을 눌러줍니다. 이후 아래처럼 jenkins bitnami 라고 검색을 합니다. 그러면 아래처럼 유사한게 나오며, 그중 첫번째인 jenkins certified by bitnami 를 선택하고 create 해줍니다. bitnami 는 앱을 패키징해주는 라이브러리? 라고 생각하면 되며, 사용자가 일일이 이것저것 설치하는게 귀찮으니 bitnami 가 미리 이것저것 설치해서 패키징 해둔 것을 이용하는 겁니다. #vm 이미지로 단지 jenkins 를 사용한다는것 뿐이므로 일반 vm 설정과 별반 다를게 없습니다. 적당한 이름 등을 넣어서 생성해줍니다. 위 이미지는 jenkins 가 자동으로 실행되고 8080 포트로 접속이 가능합니다. vm 은 디폴트로 22, 80 , 443 정도만

[입문] jenkins 에서 maven 프로젝트 설정 [내부링크]

이전 포스팅을 통해 #azure ( #애저 ) 의 #vm 을 이용해서 #jenkins 서버를 설치하고 기본세팅을 해놓았습니다. 이제 #github 에 있는 spring boot 소스를 빌드해서 jar 파일을 만드는 즉 CI 단계까지 하는 세팅을 해보겠습니다. jenkins 메인 화면에서 좌측 상단의 새로운 item 을 클릭해줍니다. 이후 아래처럼 maven project 를 선택하고 이름을 적당히 입력하고 ok 를 눌러줍니다. 이후 아래처럼 github 주소를 넣어줍니다. public repository 이므로 따로 credentials 이 필요하진 않습니다. 아래 github repo는 간단한 rest api 제공하는 spring boot 프로젝트입니다. fork 하거나 clone 하거나 아니면 이 주소 그대로를 사용해도 됩니다. 어차피 jenkins 에서 빌드가 되도록 설정하는게 목적이니까요. https://github.com/ChunGeun-Yu/springboot-rest.g

[입문] azure 의 app service 의 deployment slots 사용법 ( 애저 배포 슬롯 사용 ) [내부링크]

#azure 의 #app #service 에 보면 #deployment #slots 라는 메뉴가 있습니다. staging 용도로 우선 배포하고 , 테스트를 해본 후 문제가 없을때 production 으로 배포하고자 할때 사용하는 것이며, #blue #green #배포 라고 하는 방식과 유사합니다. blue green 배포는 아래 링크를 참고하세요 https://wallees.wordpress.com/2018/04/22/blue-green-%EB%B0%A9%EC%8B%9D/ 우선 app service 를 하나 만들겠습니다. 우선 아래처럼 spring boot 용 app service 하나 만들겠습니다. staging slot 과 production slot 이렇게 2개의 slot이 필요하므로 , app service plan 은 기본 세팅된 preminum 을 그대로 둡니다. 저렴이를 선택하면 slot 이 한개 밖에 없기에 테스트가 불가능합니다. 생성한 후 해당 리소스로 이동한 후 아

[입문] azure devOps pipeline을 활용한 CI/CD 구성 (애저 데브옵스 파이프라인 구성) [내부링크]

화면 조작이 많기에 영상으로 보는게 가장 쉽고 빠릅니다. 본 포스팅의 영상버전은 아래와 같습니다. https://youtu.be/7byRnrrqptk https://youtu.be/S8RQLNqjv3Y #azure #devOps #pipeline 을 이용해서 #spring #boot 를 #app #service 에 배포해보겠습니다. pipeline 의 CI 메뉴와 CD 메뉴 각각 분리해서 세팅하고 연동을 하겠습니다. 우선 dev.azure.com 사이트에서 repository 사용법과 app service 사용법은 알고 있다고 가정합니다. CI/CD를 위해서는 azure 에서 제공하는 agent 를 이용해야 하는데 ( 직접 agent 설치 및 구성도 가능하긴 함) 이를 위해서는 아래처럼 organiaztion setting > billing > paid parallel jobs 에 1 이상의 값을 넣고 save 를해줘야 합니다. 처음 이 메뉴들어갔다면 azure subscriptio

[입문] azure(애저) devops pipeline : No hosted parallelism has been purchased or granted. 해결법 [내부링크]

아래처럼 빌드 agent 가 돌지도 못하고 에러 날때가 있습니다. ##[error]No hosted parallelism has been purchased or granted. To request a free parallelism grant, please fill out the following form https://aka.ms/azpipelines-parallelism-request 해결방법은 크게 2가지 입니다. 에러 메시지에 적힌 https://aka.ms/azpipelines-parallelism-request 위 주소를 들어가서 나는 누구고 어느 프로젝트에 대해 limit 을 해제해 달라고 요청하면 됩니다. 수요일에 요청을 보냈는데 금요일에 처리되었다고 메일이 왔습니다. 잘 처리되었는지 아래처럼 organization settting > pipelines > parallel job 에 들어가면 빨간색으로 Free tier 라고 나옵니다. :) 위와 같이 요청 보내는건 아마

[입문] azure Kubernetes services 사용 ( 애저 쿠버네티스 k8s 사용 . AKS ) [내부링크]

AWS 에 EKS 가 있다면 azure 에는 AKS 가 있습니다. 둘다 거의 동일하며, 본 포스팅에서는 #azure #Kubernetes #services 즉 #AKS 를 이용하는 방법에 대해 간략히 알아보겠습니다. 아래는 AWS 의 EKS 사용법 입니다. https://blog.naver.com/semtul79/222055976390 AWS EKS 에서 k8s 클러스터 생성 및 설정 #kubernetes 줄여서 #k8s 라 부르는 것에 대해서는 인터넷의 다른 자료를 찾아보시고, 저는 aws 의 eks 라... blog.naver.com 우선 아래처럼 kubernetes service를 생성해줍니다. Availability zones 에는 3개로 체크 되어 있던데 돈이 비싸니 다 없애겠습니다. node size 도 최소 권장사항인 2 core, 4 GB 로 설정했고 node 수도 2개로 조정했습니다. 다른 서비스에 비해 다소 비용이 드는 서비스이다보니 최소로 설정했습니다. AKS 는

[입문] azure devOps - kubernetes service 연동 pipeline 구축 #1 ( 애저 데브옵스 파이프라인 - kubernetes/k8s 연동 ) [내부링크]

#azure #devOps의 끝판왕이라 할수 있는 #kubernetes #service 와 #pipeline 연동 구축에 대해 알아보겠습니다. 크게 아래와 같은 흐름으로 기술합니다. 1. azure devops git repository 에 node.js 용 소스 및 dockerfile 작성 2. docker 이미지 저장용으로 ACR ( azure container registry ) 생성 3. azure devops pipeline 을 이용해서 docker image build / push 4. azure kubernetes service 생성 ( AKS ) 5. azure devops pipeline 을 이용해서 ACR에 있는 이미지를 k8s 에 배포 끝판왕인 만큼 알아야 할게 많습니다. ㅡㅜ 화면조작이 많기에 아래 영상버전을 추천합니다. https://youtu.be/7byRnrrqptk https://youtu.be/S8RQLNqjv3Y 하나씩 알아보겠습니다. 1. azure

[입문] azure devOps Repos 사용 ( 애저 데브옵스 repository 사용 ) [내부링크]

azure devOps 에서 제공하는 git repository 사용법에 대해 알아보겠습니다. azure devOps 기본 사용법은 아래 링크를 참고하세요. https://blog.naver.com/semtul79/222379571864 [입문] azure(애저) devOps(데브옵스) 기본 사용법 #azure ( #애저 )에서 제공하는 #devOps ( #데브옵스 ) 에 대해 간략히 알아보겠습니다. 일반적으로 porta... blog.naver.com 아래처럼 + 를 누른 후 new repository 를 클릭해줍니다. 이후 아래처럼 팝업이 나오는데 repo 이름을 적당히 넣고 create 를 눌러줍니다. github 에서 샘플 소스를 import 할것이라서 "Add a readme" 는 uncheck 해줍니다. 이후 아래처럼 import 를 누르면 import할 원본 repo 주소를 넣으라고 나옵니다. 저는 샘플로 아래처럼 github 의 public repository 주소를

[입문] azure devOps - kubernetes service 연동 pipeline 구축 #2 ( 애저 데브옵스 파이프라인 - kubernetes/k8s 연동 ) [내부링크]

이전 포스팅에 이어 k8s 로 deploy 하는 pipeline 을 구성해보겠습니다. 아래는 이전 포스팅입니다. https://blog.naver.com/semtul79/222394382636 [입문] azure devOps - kubernetes service 연동 pipeline 구축 #1 ( 애저 데브옵스 파이프라인 - kubernetes/k8s 연동 ) #azure #devOps의 끝판왕이라 할수 있는 #kubernetes #service 와 #pipeline 연동 구축에 대해 알아보겠습... blog.naver.com 아래는 본 포스팅의 영상버전입니다. https://youtu.be/7byRnrrqptk https://youtu.be/S8RQLNqjv3Y ------------------------------- k8s 로 deploy 하기 위해서는 k8s 클러스터에서 docker 이미지 저장소에 접근해서 image pull 을 해서 docker image를 가져오고 그걸 가

azure 자격증 시험 후기 - AZ-303 Microsoft Azure Architect Technologies [내부링크]

#Azure #Solutions #Architect #Expert 자격증 취득을 위해 우선 합격해야할 #AZ #303 시험 후기입니다. 각 시험마다 준비해야할 공통적인 것은 ( 온라인 시험을 위한 사진찍기, 여권준비, ... ) #자격증 <-- 이곳을 누르면 쉽게 찾을수 있습니다. 시험준비는 기존과 동일하게 examtopics 를 통해 했습니다. 아래 링크가 AZ 303 과정의 dump 입니다. https://www.examtopics.com/exams/microsoft/az-303/view/ AZ-303 Exam – Free Actual Q&As, Page 1 | ExamTopics Custom View Settings Topic 1 - Question Set 1 Question #1 Topic 1 You have an Azure subscription that contains 10 virtual machines on a virtual network. You need to crea

azure 자격증 시험 후기 - AZ-304 azure solutions architect expert [내부링크]

#Azure #Solutions #Architect #Expert 자격증 취득을 위해 치룬 #AZ #304 시험 후기입니다. 303 과 304 를 모두 합격해야 expert 자격증이 나옵니다. 303 시험 후기는 아래를 참고하세요 https://blog.naver.com/semtul79/222402943415 azure 자격증 시험 후기 - AZ-303 Microsoft Azure Architect Technologies #Azure #Solutions #Architect #Expert 자격증 취득을 위해 우선 합격해야할 #AZ #303 시험 후기입니... blog.naver.com 각 시험마다 준비해야할 공통적인 것은 ( 온라인 시험을 위한 사진찍기, 여권준비, ... ) #자격증 <-- 이곳을 누르면 쉽게 찾을수 있습니다. 304 시험 dump는 아래를 이용했습니다. https://www.examtopics.com/exams/microsoft/az-304/view/ AZ-304

[입문] azure Kubernetes services 의 ingress controller ( 애저 쿠버네티스 k8s ingress controller . AKS ) [내부링크]

#azure #aks 로 pod 를 올린 후 #ingress #controller 를 통해 외부에서 접속이 가능하도록 해보겠습니다. aks 생성 및 인증은 아래 링크를 참고해주세요 https://blog.naver.com/semtul79/222394167482 [입문] azure Kubernetes services 사용 ( 애저 쿠버네티스 k8s 사용 . AKS ) AWS 에 EKS 가 있다면 azure 에는 AKS 가 있습니다. 둘다 거의 동일하며, 본 포스팅에서는 #azure... blog.naver.com 저는 node 2개 짜리 cluster 를 만들었습니다. k8s 클러스터 외부에서 접속이 가능하도록 하는 방법에는 ingress controller, load balancer , nodeport 등 다양한 방법이 있습니다. 이번 포스팅에서는 ingress controller 를 이용하는 방법을 알아보겠습니다. ingress controller 를 생성하기 위해 일단 전용 na

[입문] azure devOps - kubernetes service 연동 pipeline 구축 #3(java) ( 애저 데브옵스 파이프라인 - kubernetes/k8s 연동 ) [내부링크]

이전 포스팅에서 node.js 프로젝트를 #CI #CD 하는 법에 대해 알아봤습니다. 이제 마지막으로 #spring #boot 프로젝트를 CI CD 해보겠습니다. 아래 #1 #2 링크와 중복되는 부분은 설명을 하지 않을 예정이므로 아래 부터 따라하길 추천합니다. https://blog.naver.com/semtul79/222394382636 [입문] azure devOps - kubernetes service 연동 pipeline 구축 #1 ( 애저 데브옵스 파이프라인 - kubernetes/k8s 연동 ) #azure #devOps의 끝판왕이라 할수 있는 #kubernetes #service 와 #pipeline 연동 구축에 대해 알아보겠습... blog.naver.com https://blog.naver.com/semtul79/222394665795 [입문] azure devOps - kubernetes service 연동 pipeline 구축 #2 ( 애저 데브옵스 파이프라인

[입문] azure storage blob in Java ( 애저 스토리지 ) [내부링크]

#Spring #boot ( #java ) 를 이용해서 #Azure #storage #account 의 #Container storage , 흔히 #Blob storage 라고 부르는 storage 에 접근하는 방법에 대해 알아보겠습니다. Azure Container storage ( = blob ) 는 #AWS 의 #S3 와 같은 서비스라고 보면 됩니다. 즉 text 파일이나 사진, 동영상 파일등을 업로드, 다운로드 할 수있는 서비스입니다. Spring boot 를 이용할 것이므로 우선 https://start.spring.io/ <-- 여길 접속해서 기본 코드를 생성하겠습니다. 저는 아래처럼 입력을 해서 프로젝트를 생성하겠습니다. spring initializr 을 이용해서 프로젝트 생성 및 #이클립스 에서 프로젝트 import 하는 법은 아래 링크를 참고하세요. https://blog.naver.com/semtul79/222359288073 spring boot initiali

[입문] azure storage 접근제어 (1/4)- Managed Identity [내부링크]

azure 의 리소스를 생성,수정,접근,삭제 등을 하려면 인증/인가를 통해 "누구인지, 어떤 리소스에 접근이 가능한지, 접근가능한 리소스에 대해 생성,삭제... 중 어떤 걸 할수 있는지.." 등과 같은 걸 판단하는 과정을 거칩니다. 개인 계정으로 azure portal 에 로그인하면 모든 리소스에 대해 모든 작업을 할 수 있는데, 그건 admin 계정이고 그 계정에 모든 리소스에 대한 full access 가 미리 세팅되어 있기에 가능한 겁니다. ( 회원가입시 azure 에서 알아서 세팅해줍니다. ) 보통 회사에서는 개발자, 관리자 , 운영자 등 역할에 맞게 계정을 생성해주며, 외부업체에 일주일정도 demo 용으로 접근가능한 key를 만들어주기도 하고, 특정 application 만을 위한 id 를 생성해주기도 합니다. 이런식으로 복잡한 용도에 대응하기 위해 아래처럼 4가지 인증/인가 방식이 존재합니다. 1. Managed Identity 2. Service Principal (ht

[입문] azure storage 접근제어 (2/4)- Service Principal ( 서비스 주체) [내부링크]

아래 포스팅에서 managed identity 인증/인가 방법에 대해 알아봤습니다. https://blog.naver.com/semtul79/222434975406 [입문] azure 인증/인가 - Managed Identity azure 의 리소스를 생성,수정,접근,삭제 등을 하려면 인증/인가를 통해 "누구인지, 어떤 리소스에 접... blog.naver.com 이번에는 아래 4가지중 service principal . 우리말로는 서비스 주체 라고 부르는 것에 대해 알아보겠습니다. 1. Managed Identity(https://blog.naver.com/semtul79/222434975406) 2. Service Principal 3. Shared Signature Access(https://blog.naver.com/semtul79/222436247475) 4. Account Key / Access Key / Master Key(https://blog.naver.com/sem

[입문] azure storage 접근제어 (3/4)- Shared Signature Access ( 공유 액세스 서명 ) [내부링크]

#azure #blob #storage #접근제어 방법중 아래 3번 shared signature access ( 공유 액세스 서명 ) 에 대해 알아보겠습니다. 1. Managed Identity(https://blog.naver.com/semtul79/222434975406) 2. Service Principal(https://blog.naver.com/semtul79/222435389282) 3. Shared Signature Access 4. Account Key / Access Key / Master Key(https://blog.naver.com/semtul79/222436369979) 아래처럼 storage account > shared signature access 메뉴에서 allowed resource types 를 체크하면 하단에 generate SAS and connection string 이라는 버튼이 활성화 됩니다. 이를 클릭합니다. 클릭하면 아래처럼 하단에 S

[입문] azure storage 접근제어 (4/4)- access key ( 애저 스토리지 - 액세스키 ) [내부링크]

#azure #blob #storage #접근제어 방법중 아래 4번 access key 에 대해 알아보겠습니다. 1. Managed Identity(https://blog.naver.com/semtul79/222434975406) 2. Service Principal (https://blog.naver.com/semtul79/222435389282) 3. Shared Signature Access(https://blog.naver.com/semtul79/222436247475) 4. Account Key / Access Key / Master Key 3번과 사용법은 유사합니다. 즉 간단합니다. storage account > access keys 로 이동한 후 상단의 show keys 를 누르면 아래처럼 key 값들이 보입니다. key 1, key 2 이렇게 2개가 있는 이유는 rotate key 를 통해 재생성을 할 수 있습니다. 만약 key 1,2 모두 재생성 하고 싶을때, ke

[입문] azure cognitive service - translation ( 애저 번역 서비스 ) [내부링크]

#azure 를 이용한 #tranlation ( #번역 ) 서비스 사용 방법에 대해 알아 보겠습니다. hello -> 안녕 이런식으로 번역도 해주고, hello -> 언어: 영어 처럼 어떤 언어인지 등과 같이 번역 관련 여러 서비스를 함께 제공해주고 있습니다. 자세한 정보는 아래를 참고하세요 https://docs.microsoft.com/ko-kr/azure/cognitive-services/translator/translator-info-overview 본 포스팅의 영상버전은 아래와 같습니다. 포스팅만으로 따라하기 힘들면 영상을 보며 따라해보세요. https://youtu.be/Iu1fEeLSQ3k https://youtu.be/RF-kMFV4djk 이론은 위 링크에게 맡기고 여기서는 번역 서비스를 실제로 어떻게 사용할 수 있는지 알아보겠습니다. #portal 에서 #cognitive #service 라고 검색해서 해당 서비스로 들어간 후 아래처럼 +Add > + Translat

[입문] azure cognitive service - Computer vision OCR( 애저 비전 문자 판독 ) [내부링크]

#azure #cognitive #service 중 하나인 #Computer #vision 서비스 . 그중에서 #OCR 서비스 사용방법에 대해 알아보겠습니다. 번역서비스에서 이미 설명한 부분은 생략하였으니, 잘 모르는게 있으면 아래 번역 서비스 포스트부터 읽어주세요. https://blog.naver.com/semtul79/222442850030 [입문] azure cognitive service - translation ( 애저 번역 서비스 ) #azure 를 이용한 #tranlation ( #번역 ) 서비스 사용 방법에 대해 알아 보겠습니다. hello -> 안녕 이... blog.naver.com 본 포스팅의 영상버전입니다. 포스팅만으로 따라하기 어려우면 영상을 참고하세요 https://youtu.be/si3BQi_ZeNc OCR (optical character reader)은 사진에서 글자를 찾아내는걸 뜻합니다. 이전에 다룬 #번역 ( #translator ) 서비스처럼 #

[입문] azure storage account - queue ( 애저 스토리지 큐 ) [내부링크]

#azure 에서 제공하는 #queue 서비스 중 가장 간단한 기능이면서 큐 사이즈가 가장 큰 #storage #account #queue 에 대해 알아보겠습니다. 대표적인 message queue 중의 하나인 #rabbit #mq 같은건 복잡한 용도를 대부분 지원할 수 있는 기능들이 있습니다. #azure 에서는 #service #bus 가 이에 해당합니다. 지금 다룰 storage account 의 queue 는 복잡한 기능은 제공하지 않으나, 대신 저장소의 역할에 강점이 있습니다. 즉 큐 사이즈를 100GB 처럼 크게 잡고 싶다.. 대신 #pub #sub 이런건 필요없다. 등의 용도에 적합합니다. #service #bus VS #storage #account #queue 의 구체적인 차이점은 아래 링크를 참고하세요. https://medium.com/awesome-azure/azure-difference-between-azure-storage-queue-and-service-b

docker command 정리 ( 도커 명령어 rm, ls, prune, ... ) [내부링크]

#docker #command 에 대한 실제 명령실습 및 상세한 설명은 아래 영상에서 확인하세요 https://youtu.be/ZbRHHthGdro https://youtu.be/OI8HsHJCo50 https://youtu.be/vwgzCPP7-l4 #도커 #이미지 명령(docker image ...) 원격에 있는 #docker #image 를 로컬에 가져오기 docker image pull <이미지:태그> docker image pull docker/getting-started:latest 도커 이미지 빌드하기 docker image build -t 이미지명[:태그명] Dockerfile경로 docker image build -t mytest/hello:1.0 . 로컬에 있는 docker image 리스트 확인하기 docker image ls docker image에 새로운 이름/태그 추가하기 기존 이미지는 그대로 존재하고, 새로운 이름/태그가 추가됨. docker image t

selenium 만 써봤나요? puppeteer + mocha + chai 로 웹 자동화 테스트 / 크롤링 ( puppeteer #1 ) [내부링크]

혹시 웹 자동화 툴로 #selenium 만 알고 있지는 않나요? #puppeteer 라고 github star 가 70k 가 넘는 웹 브라우저 자동화 툴에 대해 알아보겠습니다. 추가로 #mocha 와 #chai 라는 javascript 테스트 프레임워크 및 판정 라이브러리도 함께 조합해서 어떻게 웹 자동화 테스트 / 크롤링을 할 수 있는지 알아보겠습니다. 1. puppeteer 2. mocha 3. chai 현재 포스트의 영상버전은 아래와 같습니다. 영상에 더 많은 팁과 설명, 노하우가 있으니 영상시청을 추천합니다. https://youtu.be/f_-iWhq_nJQ 우선 puppeteer 부터 알아봅시다. https://github.com/puppeteer/puppeteer GitHub - puppeteer/puppeteer: Headless Chrome Node.js API Headless Chrome Node.js API. Contribute to puppeteer/puppet

selenium 만 써봤나요? puppeteer + mocha + chai 로 웹 자동화 테스트 / 크롤링 ( puppeteer #2 ) [내부링크]

아래와 같이 지난 포스팅에서 #puppeteer 설치 및 기본 사용법에 대해 알아봤습니다. https://blog.naver.com/semtul79/222458612186 puppeteer + mocha + chai 로 웹 자동화 테스트 / 크롤링 ( puppeteer #1 ) 혹시 웹 자동화 툴로 #selenium 만 알고 있지는 않나요? #puppeteer 라고 github star 가 70k 가 넘는 웹 ... blog.naver.com 이제 좀 더 puppeteer 로 웹 자동화 하는 방법에 대해 알아보겠습니다. 현재 포스트의 영상버전은 아래와 같습니다. 영상에 더 많은 팁과 설명, 노하우가 있으니 영상시청을 추천합니다. https://youtu.be/f_-iWhq_nJQ puppeteer나 selenium 이나 라이브러리 사용법이 약간 다를뿐 결국 특정 element 를 찾아서 click 등의 이벤트 주는것이 전부입니다. 즉 적절한 element 찾는 방법이 가장 중요합니다

selenium 만 써봤나요? puppeteer + mocha + chai 로 웹 자동화 테스트 / 크롤링 ( mocha, chai ) [내부링크]

지난 포스팅을 통해 #puppeteer 를 이용한 웹 브라우저 자동화 방법에 대해서 알아봤습니다. 여기까지만 해도 자동화 테스트를 할 수 있습니다. 특정 버튼 클릭시 이후 특정 화면이 나와야 한다고 했을때, xx.click() 이후 page.$x(xxx) 처럼 해서 특정 element 를 찾기 시도를 하고 만약 못찾았다면 fail 이고, 찾았으면 success 로 판단하도록 click, find, if ~ else 를 한땀한땀 코딩하면 되기 때문입니다. 이렇게 if ~ else 도와주는게 테스트 라이브러리입니다. #java 에는 #junit 이 있다면 #javascript 에는 #mocha 가 있습니다. https://mochajs.org/ Mocha - the fun, simple, flexible JavaScript test framework Mocha is a feature-rich JavaScript test framework running on Node.js and in t

selenium 만 써봤나요? puppeteer + mocha + chai 로 웹 자동화 테스트 / 크롤링 ( 최종 완성 ) [내부링크]

#puppeteer + #mocha + #chai 마지막 포스팅입니다. 소스코드는 아래와 같으며, 각 라인별로 주석을 달았습니다. 전체 소스는 맨 아래에 github 주소를 넣었습니다. const { expect } = require("chai") const puppeteer = require('puppeteer'); describe('ui 자동화 테스트 샘플', function() { let browser; let page; // 최초 1번 수행 before(async function() { // runs once before the first test in this block console.info("before") browser = await puppeteer.launch({ headless: false, args: ['--window-size=1920,1080'], slowMo: 30, // 30ms 씩 delay }) page = await browser.newPage()

azure 의 가상 네트워크 생성하는 법( 애저 vnet , virtual network, vpc ) [내부링크]

#AWS 의 #vpc 에 해당하는 #azure 의 #vnet , 즉 가상 네트워크, virtual network 에 대해 알아보겠습니다. VM 이나 gateway 등과 같이 ip가 필요한 서비스를 생성할때, 그 서비스는 어떤 네트워크에 속해있어야 합니다. 그래서 vnet 을 해당 서비스 생성중에 기존의 vnet 중 하나를 선택하거나, 아니면 새로운 vnet 을 만들라고 가이드가 나옵니다. 아래는 #application #management 라는 api gateway 를 생성할때 나오는 virtual network 선택화면 입니다. 기존에 만든 안쓰는걸 선택하거나, 아니면 아래에 보이는 create new 를 눌러서 새롭게 생성해야 합니다. 이렇게 특정 서비스의 바로가기 링크(=create new 라는 버튼 )를 눌러서 vnet 을 만들수 있습니다. 아래 화면은 위의 create new 를 누르면 나오는 화면입니다. 위와 같이 꼭 필요한 메뉴를 입력해서 quick 하게 vnet 을 만

azure ( 애저 ) application gateway 10분만에 끝내기 #1/2 [내부링크]

#azure ( #애저 ) 에서 #application #gateway 만드는 방법에 대해 알아보겠습니다. 본 포스팅의 영상 버전은 아래와 같습니다. 영상에 더 많은 설명과 그림이 있어 이해하기 더 쉽습니다. https://youtu.be/iIhW6Y4HjmM https://youtu.be/XwojaFEq9d4 azure portal 에서 application gateway 라고 검색해서 서비스로 진입한 후 상단의 +create 를 눌러줍니다. 이후 아래처럼 적당한 값을 채워줍니다. 테스트 용도이므로 auto scaling은 no 로 설정하고 instance count는 1로 해서 저렴하게 만듭니다. #vnet 을 적당히 선택하거나, 없다면 create new 를 눌러서 새롭게 하나 만듭니다. 이후 frontends 탭에서 아래처럼 public ip 를 할당해줍니다. 없다면 add new 를 눌러서 하나 만듭니다. frontends 는 api gateway 의 앞단을 의미하며, pu

azure ( 애저 ) application gateway 10분만에 끝내기 #2/2 [내부링크]

이전 포스팅에서 #application #gateway 를 생성해보았습니다. 이제 라우팅 룰대로 잘 동작하는지 테스트를 해보겠습니다. 우선 pool1 과 poo2 를 만들었고, 라우팅 룰에 의해 pool1 혹은 pool2 로 전달됩니다. 그럼 pool1 은 어떤 응답을 주는지 봅시다. pool1, pool2 모두 #app #service 를 이용해서 만들었으며, pool1 은 아래처럼 json을 리턴하도록 만들어두었습니다. ( 여러분은 여러분의 app service 코드에 맞는 값이 리턴됩니다. 제가 만든 app service는 이렇다는 것 뿐입니다. ) pool2 는 portal 에서 만들기만 하고 따로 소스코드를 넣고 빌드/배포를 하지 않아서 기본 화면이 아래처럼 나오게 되어 있습니다. 위의 그림들은 실제 서버로 바로 접속한 것이고, 우리가 하고 싶은건 #application #gateway 를 통해서 접속하는것입니다. 아래처럼 overview 에 보면 frontend publi

5분 완성! Azure api management ( 애저 api gateway , apim ) 생성 및 테스트하기 [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 #Azure 의 #api #gateway 서비스인 #Azure #api #management 를 만들어보겠습니다. 본 포스팅의 영상버전은 아래와 같으며 영상에 더 많은 설명과 그림이 있습니다. https://youtu.be/H1r7OgF33x4 portal 에서 api

Azure api management ( 애저 api gateway , apim ) 의 product ( 제품 ) 생성, policy 적용 [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 지난 포스팅에서 #azure #apim 을 생성하고 #api 를 추가하고 테스트까지 해봤습니다. 가장 기본 기능이지만 이 기능을 가지고 #api #gateway 라고 하기에는 뭔가 많이 부족해보입니다. 이번 포스팅에서는 #product ( #제품 ) 라는 걸 만들어서 추

5분 완성! Azure api management ( 애저 api gateway , apim ) 의 metrics, alert 설정 [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 #azure #api #gateway 인 #apim 에 대한 모니터링에 대해 알아보겠습니다. 본 포스팅의 영상버전은 아래와 같으며 영상에 더 많은 설명과 그림이 있습니다. https://youtu.be/SKB0kAKyw_I 아래처럼 #metrics 메뉴에 들어간 후, m

5분 완성! Azure api management ( 애저 api gateway , apim ) 의 revision 관리 [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 서버 개발을 하다보면 #rest #api 를 수정한 후 배포를 하게 되는데, 기존 연동 규격과 호환이 되지 않는 변경 사항 처럼 연관된 서비스들과 잘 동작하는지 확인이 필요하면서, 기존 서비스들과 잘 동작하는 건 유지하고 싶다~ 처럼 변경된 api 도 배포하면서, 기존

1분 완성! Azure api management ( 애저 api gateway , apim ) 의 version 관리 [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 이전 포스팅에서 #azure #apim 의 #revision 관리에 대해 알아봤습니다. revision을 이해했다면 #version 은 그 상위개념일뿐 다를게 없어서 쉽게 알수있습니다. 본 포스팅의 영상버전은 아래와 같으며 영상에 더 많은 설명과 그림이 있습니다. htt

10분 완성! Azure api management ( 애저 api gateway , apim ) 의 developer portal ( swagger 화면 구성 ) [내부링크]

apim 생성: https://blog.naver.com/semtul79/222472448357 product, policy: https://blog.naver.com/semtul79/222478446770 metrics, alert: https://blog.naver.com/semtul79/222478521906 revision: https://blog.naver.com/semtul79/222478902169 version: https://blog.naver.com/semtul79/222478921440 developer portal: https://blog.naver.com/semtul79/222479614415 #azure #api #management 의 마지막 포스팅입니다. 보통 rest api 서버를 만들면 #swagger 를 통해 api 규격을 개발자들에게 알려줍니다. #apim 은 rest api 의 관문 역할을 해주므로, 이곳에도 swagger 같은 기능이 있습니다.

Azure Cognitive - Custom vision 생성 [내부링크]

#azure 의 #인지 서비스 ( #cognitive service ) 중의 하나인 #custom #vision 에 대해 알아보겠습니다. 1. Azure Cognitive - Custom vision 생성 ( https://blog.naver.com/semtul79/222481236606 ) 2. Azure Cognitive - Custom vision 을 이용한 가족 사진 판별하기( https://blog.naver.com/semtul79/222481693628 ) 3. Azure Cognitive - Custom vision 모델 향상 및 rest api로 예측 ( https://blog.naver.com/semtul79/222484842654 ) 본 시리즈의 영상버전은 아래와 같습니다. 영상에 더 많은 설명과 사용법이 나와있습니다. https://youtu.be/R7d-z2gzdf0 custom vision 은 사용자가 직접 태그를 설정해서 이미지를 등록해주면 azure 가 알

Azure Cognitive - Custom vision 을 이용한 가족 사진 판별하기 [내부링크]

1. Azure Cognitive - Custom vision 생성 ( https://blog.naver.com/semtul79/222481236606 ) 2. Azure Cognitive - Custom vision 을 이용한 가족 사진 판별하기( https://blog.naver.com/semtul79/222481693628 ) 3. Azure Cognitive - Custom vision 모델 향상 및 rest api로 예측 ( https://blog.naver.com/semtul79/222484842654 ) 이전 포스팅에서 #Azure #Cognitive - #Custom #vision 생성 및 이미지 업로드, test 하는 방법에 대해 알아봤습니다. 하나의 태그당 이미지를 6~7장만 넣어서 학습을 시키니, 정확도가 너무 떨어지는것을 확인했기에 이번에는 이미지 100장 정도씩 넣어서 학습을 시켜봤습니다. 각 태그당 이미지 100장씩 있으려면 제가 그 만큼의 사진도 있어야 하

Azure Cognitive - Custom vision 모델 향상 및 rest api로 예측 [내부링크]

1. Azure Cognitive - Custom vision 생성 ( https://blog.naver.com/semtul79/222481236606 ) 2. Azure Cognitive - Custom vision 을 이용한 가족 사진 판별하기( https://blog.naver.com/semtul79/222481693628 ) 3. Azure Cognitive - Custom vision 모델 향상 및 rest api로 예측 ( https://blog.naver.com/semtul79/222484842654 ) 이번 포스트에서는 #azure #cognitive ( #애저 #인지 서비스 ) 중 #custom #vision 에 대한 모델 향상 방법 및 #rest #api 를 통한 예측 값 받아오는 법에 대해 알아보겠습니다. 우선 아래와 같은 여자레고 이미지 약 50장 + 남자레고 이미지 약 50장을 넣고 man과 woman 이라는 tag ( = label ) 를 달아서 train

azure 자격증 시험 후기 - Administering Relational Databases (DP-300) [내부링크]

#Azure #자격증 중 #데이터베이스 관련 #DP #300 시험 후기입니다. DP-300 은 데이터베이스중 RDB 즉 관계형 데이터 베이스에 관한 시험이며, 좀 더 정확히는 MS SQL Server 를 base 기반으로 클라우드 환경에 맞게 일부 기능/성능을 수정한 "Azure 에서 제공하는 DB" 에 관한 시험입니다. #AWS 의 #오로라 DB 와 유사한 서비스라고 보면 됩니다. 즉 #MS #SQL #Server 를 이미 좀 사용해봤다면 꽤 쉽게 합격할 수있을듯 합니다. 저는 #mysql 과 #oracle 만 주로 써서 특이한 기능이나 용어 공부한다고 좀 힘들었습니다. 시험 #dump 는 아래 사이트를 이용했으며, 실제 시험에서 50% 정도 나왔습니다. https://www.examtopics.com/exams/microsoft/dp-300/view/ DP-300 Exam – Free Actual Q&As, Page 1 | ExamTopics Custom View Settings

"일을 잘한다는 것" 독서 후기 [내부링크]

일을 잘한다는 것 일을 잘한다 -> 성과를 잘 낸다. -> 기술을 잘안다가 아니라 성과를 잘 낸다 임. 즉 기술만으로 성과가 잘 나지 않고 기술 & 감각 으로 성과가 잘 난다. 감각이란 문제의 본질을 알아차리는것, 자신의 재능/특성에 맞는 일을 하는것 , 사람을 이해하는 것 등이 된다. SWOT 처럼 bottom up 방식으로 문제분석도 좋으나, 이는 "문제해결"이라는 최종목표가 아닌 "문제분석"이 최종 목표가 되어 버릴수 있다. 감각으로 top down 방식으로 우선 필터링을 몇개 한후 들어가는 것도 좋은 방법일 수 있다. 기내식 A vs B 중 A가 항상 품절. 승무원은 품절시 고객응대를 잘 하는 "기술"만 중요시 했는데 사실은 A를 더 많이 입고 하는식으로 문제를 해결할 수 있다. 그러나 "기술"만이 성과라고 생각할수 있다. 문제의 근본 원인을 파악하는 "감각"이 중요하다. 스페셜리스트와 제너럴리스트 모두 좋은 것이다. 기술 ,감각 모두 중요한 것이고, 자신의 역량/재능에 따라

LG 모니터 24MP500W 제품 후기 [내부링크]

가성비 좋은 LG 24 인치 모니터 입니다. 독서모드가 지원되어 블루라이트가 없고 편안하게 볼수 있으며 17~18만원대로 24인치 모니터 구매할 수 있답니다. hdmi 포트가 2개 있으며 그외 VGA 등의 오래된포트는 지원하지 않습니다. 현재 해시태그 이벤트를 하고 있어서 관심있으신 분은 구매해보세요

azure 에서 kafka 클러스터 1분만에 생성하는 법 ( 애저, 카프카 ) [내부링크]

#azure ( #애저 ) 에서 #kafka ( #카프카 ) 생성하는 방법은 여러가지가 있습니다. #vm 에 직접 카프카 설치해도 되고, 카프카 이미지가 있는 vm 을 market place 에서 찾은 후 그걸로 vm 을 구동해도 됩니다. 테스트 용도가 아니라면 카프카 클러스터로 구성할것이고 이러면 클러스터설정해야 합니다. 그리고 #스키마 ( #schema ) 서버 설정 등 할게 많아 집니다. 그래서 지금 소개하는 #event #hub ( #이벤트 #허브 )를 kafka 로 활용하는 방법에 대해 소개하고자 합니다. 현재 글의 동영상 버전은 아래와 같습니다. 화면 조작이 다소 있으므로 동영상 시청이 좀더 이해하기 쉽습니다. https://youtu.be/uq2XtxKmWL4 https://youtu.be/x93Wf8dn51s 이벤트 허브는 kafka의 애저 버전이라고 보면 되는데, kafka 기본 기능 제공 + 애저의 추가 기능 = 이벤트 허브 라고 생각하면 이해가 쉽습니다. azur

Azure 의 NoSQL 서비스중의 하나인 storage Table 알아보기 ( 애저 스토리지 테이블 ) [내부링크]

#Azure ( #애저 ) 에서 제공하는 대표적인 #NoSQL 서비스는 #cosmos #DB 입니다. 이번 포스팅에서는 cosmos DB 에 대해 알아보는게 아니라! cosmos DB의 심플 버전인 #storage #Table 에 대해 알아보겠습니다. :) azure portal 에서 어떻게 만들면 되는지 알아보겠습니다. portal 사이트의 검색창에 storage account 라고 검색해서 해당 서비스로 진입한 후 +create 를 누른 후 아래처럼 적당한 값을 넣어줍니다. storage account name을 기반으로 url이 만들어지므로 test, tabletest 뭐 이런 일반적인 이름을 적으면 이름중복되어서 다시 적으라고 나오니 주의하세요. redundancy 에는 디폴트로 GRS 라고 나올건데 그대로 사용해도 되나, 조금 더 저렴한 LRS 를 사용하겠습니다. 테스트 용도이니 부담없이 아무거나 선택하세요~ 이후 생성이 완료되고 나면, 아래처럼 해당 리소스로 이동 한 후

Azure 의 NoSQL - storage Table in java ( 애저 스토리지 테이블 ) [내부링크]

지난 포스팅에서 #storage #account #table 에 대해 알아봤습니다. https://blog.naver.com/semtul79/222570376447 Azure 의 NoSQL 서비스중의 하나인 storage Table 알아보기 ( 애저 스토리지 테이블 ) #Azure ( #애저 ) 에서 제공하는 대표적인 #NoSQL 서비스는 #cosmos #DB 입니다. 이번 포스팅에서는... blog.naver.com 이제 실전 감각을 익히기 위해 java, spring boot 로 insert, select 등을 해보겠습니다. 아래에 설명된 코드의 전체 코드는 맨 아래에 github 주소를 넣어두었으니 참고하세요. 일반적으로 java , python 등으로 database 에 insert, select 등을 하려면 우선 DB 접속 정보를 알아야 합니다. 즉 ip, port, id, password .. 이런것들이겠죠. 이런 정보들을 어디서 가져오는지 부터 알아보겠습니다. secur

spring kafka 를 이용한 producer , consumer 구현 #1/3 ( 기본편 ) [내부링크]

spring-kafka 라는 spring 전용 kafka 라이브러를 이용해서 spring boot 에서 손쉽게(?) producer, consumer 구현하는 방법에 대해 알아보겠습니다. #카프카 는 #azure 에서 제공하는 걸(아래 링크참고) 이용했으며, #aws 등에서 제공하는 것을 써도 되고, 직접 #kafka 구축한 후 테스트해도 됩니다. 참고로 partition 수 2개로 설정했습니다. 이 값에 따라 consumer 의 실제 구동 수가 결정됩니다. 여기서는 2 이므로 최대 2개 consumer 만 실제 active 상태이며, 그 이상의 consumer가 있어봤자 standby 상태로 그냥 놀고 있다고 보면 됩니다. https://blog.naver.com/semtul79/222562511305 azure 에서 kafka 클러스터 1분만에 생성하는 법 ( 애저, 카프카 ) #azure ( #애저 ) 에서 #kafka ( #카프카 ) 생성하는 방법은 여러가지가 있습니다. #v

spring kafka 를 이용한 producer , consumer 구현 #2/3 ( 멀티 파티션 대응용 ) [내부링크]

지난 포스팅에서는 가장 기본적인 구현으로 producer , consumer 를 구현했습니다. 실제 실무에서는 단일 파티션이 아닌 4개, 16개 ... 이런식으로 많은 파티션으로 구성된 토픽을 consumer 할 경우가 많습니다. docker로 파티션 수만큼의 spring boot 를 구동시켜도 되나, consumer의 주요 내용이 DB 쿼리, http request 등 I/O가 많은 작업이라면 cpu, mem이 많이 놀게 되므로 , 단일 쓰레드가 아닌 멀티 쓰레드로 consumer 가 구동되도록 하는게 좋습니다. 이를 위해서는 조금 복잡한 환경 구성이 필요합니다. consumer 는 사실 @KafkaListener 라고 어노테이션이 들어간 함수입니다. 우리가 원하는 건 @KafkaListener라고 어노테이션 들어간 함수가 한개 쓰레드가 아닌 여러쓰레드에서 구동되는 것입니다. 이를 위해서는 아래처럼 ConcurrentKafkaListenerContainerFactory 라는 빈을

spring kafka 를 이용한 producer , consumer 구현 #3/3 ( DLQ 구현 ) [내부링크]

마지막으로 #DLQ ( #DeadLetterQueue ) 구현을 해보겠습니다. 기존 kafkaConfig 클래스에서 할 일이 많습니다. 자세한 건 소스에 주석을 달았으니 그걸 참고하세요. 핵심만 적으면 listener 에서 exception 이 발생했을 때, 1) 몇 번 재시도를 할것인지, 2) 재시도 간의 interval 은 얼마로 둘건지, 3) 최종적으로 실패가 되었을때, 어느 토픽으로 send 하면 되는지를 설정해야 합니다. 1,2번에 대한 것은 retryTemplate() 함수에서 retryTemplate 객체를 만든 후 아래를 호출해서 1,2번을 설정해줍니다. factory.setRetryTemplate(retryTemplate()); 3번은 DeadLetterPublishingRecoverer 를 만들어서 어느 토픽으로 send할지 정해주고, 아래처럼 호출해서 에러 핸들러를 등록해주면 됩니다. 이미 retryTemplate 에서 몇번재시도할지, 얼마의 interval을 둘

kafka 이용시 주의사항 - 리밸런스, 파티션확대 [내부링크]

아래 시리즈를 통해 kafka 에 대해 알아봤습니다. 1) spring kafka 를 이용한 producer , consumer 구현 #1/3 ( 기본편 ) - https://blog.naver.com/semtul79/222584312432 2) spring kafka 를 이용한 producer , consumer 구현 #2/3 ( 멀티 파티션 대응용 ) - https://blog.naver.com/semtul79/222585334725 3) spring kafka 를 이용한 producer , consumer 구현 #3/3 ( DLQ 구현 ) - https://blog.naver.com/semtul79/222587574854 이제는 kafka 를 이용해서 서비스 개발시 주의사항에 대해 살펴보겠습니다. 1. 리밸런스 consumer가 추가되거나 삭제될 경우, 파티션을 남아있는 consumer 에게 재할당하게 됩니다. 이를 리밸런싱 이라고 합니다. 모든 consumer 들이 리밸런싱에

[2021 마이 블로그 리포트] 블로그 빅데이터로 알아보는 '2021 내 블로그 스타일' [내부링크]

2021 마이 블로그 리포트 2021년 당신의 블로그 스타일을 확인하고 네이버페이 GET하세요! campaign.naver.com

NoCode with azure logic apps ( 애저 로직 앱스를 이용한 노코드 ) [내부링크]

요즘 #NoCode 가 trend 되고 있는것 같습니다. #RPA , #workflow , #ETL , #스크레치 등등 #noCode 혹은 #LowCode 를 이용한 생산성 향상 툴 들이 많이 나옵니다. 이번 포스팅에서는 #azure (#애저) 에서 제공하는 workflow 인 #logicApps 에 대해 알아보겠습니다. no code 라서 코딩은 하나도 없으나 대신 마우스 클릭처럼 화면 조작이 엄청 많습니다. 그러므로 아래 동영상으로 학습하는걸 추천드립니다. https://youtu.be/YAhd21sB4Lc 우선 azure portal에 들어간 후 logic app 이라고 검색을 하고 logic app 하나를 생성합니다. 아래처럼 세팅할건 거의 없습니다. 단순 테스트 용도라서 consumption type을 선택했습니다. 이건 사용할때만 비용이 나가는 옵션이라서 혹시 모르고 리소스를 지우지 않았더라도 비용이 얼마 안나가니 좋습니다. reivew + create 를 클릭해서 리소스

IntelliJ Community for windows 설치,spring boot 프로젝트 생성 및 구동하기 [내부링크]

#windows 용 #IntelliJ #Community 버전 설치 및 java 설정, 그리고 spring boot 프로젝트 생성 및 구동까지 해보겠습니다. 아래 사이트에서 community 버전(=무료버전)을 다운로드 합니다. ultimate 는 유료버전입니다. https://www.jetbrains.com/ko-kr/idea/download/#section=windows 다운로드 IntelliJ IDEA: 우수성과 인체 공학이 담긴 JetBrains Java IDE 최신 버전 다운로드: IntelliJ IDEA (Windows, macOS, Linux) www.jetbrains.com exe 파일 다운로드 후 클릭하면 설치가 완료됩니다. 그냥 클릭만 하면 됩니다. windows PC에는 당연히 java 가 설치되어 있어야 하고 JAVA_HOME과 PATH 설정도 해둬야 합니다.(당연히 아실거라고...) 자 이제 intelliJ 시작해보겠습니다. community 버전은 무료이므로

IntelliJ Community 로 spring boot active profile 설정하는 법 ( vm option ) [내부링크]

실무에서는 개발용, 운영용, QA용 과 같이 다양한 환경에서 spring boot 를 구동시킵니다. 따라서 각 환경에 맞는 application-{profile}.yml 파일을 만들어서 환경설정을 합니다. IntelliJ 에서 각 환경에 맞게 구동을 시키고자 할 경우 spring boot 의 active profile 을 설정해야 하는데 community는 무료버전이라서 유료버전과 약간 다릅니다. 정확히는 spring boot active profile 이라는 메뉴가 없고 vm option 설정을 통해 active profile을 설정해 줍니다. 사실 spring boot active profile 이라는 것도 vm option 으로 설정하는 것이긴 합니다. spring boot 를 한번 실행시켰으면 아래처럼 우측 상단의 콤보박스(?) 에 main 함수가 있는 클래스 이름이 나옵니다. 그걸 클릭하면 아래에 Edit configuration 이라는 서브 메뉴가 나오는데 그걸 클릭합니다

IntelliJ Community 에서 spring boot 개발시 유용한 설정들 [내부링크]

제목에는 spring boot 개발시 유용한 설정이라고 했지만 java 프로그램 개발시 동일하게 유용한 설정들이 되겠습니다. 1) 자동 import ObjectMapper mapper; <-- 이런식으로 코딩을 했을때, ObjectMapper 라는 클래스가 현재 설정된 의존성내에서 단 하나밖에 없다면, 즉 명확하다면 자동으로 import xxx.ObjectMapper; 라는 import 문을 넣어주는 기능입니다. 아래처럼 우측 상단의 설정 아이콘을 클릭하고 그 아래의 Settings 를 클릭합니다. 이후 아래처럼 Editor > General > Auto import 메뉴에서 Add unambiguous import on the fly 를 체크해주면 됩니다. 2) 사용하지 않는 import 문 자동 삭제 위 1번과 동일한 메뉴에서 Optimize imports on the fly 를 체크해주면 됩니다. 이러면 코딩 후 저장할때가 아닌, 코딩하면서 자동으로 import 문을 삭제해줍니

spring boot + h2 database 사용법 [내부링크]

로컬이나 remote 에 설치된 RDB가 없을 때 간단한게 h2 DB를 spring boot 에서 내장 실행할 수 있습니다. 여기서 내장이란 따로 h2 를 설치할 필요없이 pom.xml 이나 build.gradle 에 의존성을 추가하는 것만으로 spring boot 실행시 h2 를 함께 구동시켜 주는 걸 말합니다. 내장 tomcat 이 spring boot 구동시 함께 구동하는 것과 같은 의미입니다. build.gradle 에 아래처럼 추가해줍니다. spring boot 에서 h2 에 대한 버전을 관리해 주므로 버전을 명시하지 않으면 spring boot 버전에 맞는 적당한 버전으로 설정이 됩니다. dependencies { (생략) runtimeOnly 'com.h2database:h2' } application.yml 에 h2 관련 설정을 해보겠습니다. 아래에 각 항목마다 주석을 달았기에 자세한 건 주석을 참조 하세요. spring: # h2 DB 는 개발용도로만 사용하고 운영에

spring boot JPA 를 위한 application.yml 설정 [내부링크]

spring boot 에서 JPA 사용시 application.yml 설정을 정리합니다. 각 항목별 상세한 설명은 각 라인별 주석을 넣었으면 참고하세요. spring: jpa: open-in-view: false # 디폴트 true 인데, 일반적으로 false가 맞음. transaction내에서만 영속성 상태유지 여부. hibernate: ddl-auto: create # 시작시 새로 테이블 생성함. 최초에만 create 로 하고, 그 이후는 none 으로 하면 생성된 DB를 지우지 않음. naming: # 엔티티 클래스명, 변수명을 실제 DB의 컬럼,테이블명으로 변환하는 규칙. implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy # 기본값 # 논리명을 실제 물리명으로 변환하는 규칙. ex) user -> usr physical-strategy: org.springframe

spring boot JPA 개발팁 [내부링크]

@Entity 클래스에는 @Setter 를 넣지 않습니다. 대신 별도의 set용 함수를 만들어서 set 을 호출하는 부분이 어디인지 확인 및 제어를 해야 합니다. 그래야 값이 마구마구 변경되는걸 막을 수 있고 디버깅시 해당 set 함수를 기준으로 찾으면 되기에 편합니다. 클래스에는 @Transactional(readOnly = true) 을 적어주고 write 가 필요한 함수에서만 @Transactional 을 적어줍니다. read 만 하는 할 경우 readOnly 를 사용하면 약간의 성능 향상이 될 수 있기 때문입니다. 클래스와 함수에 @Transactional 이 모두 들어가 있으면 함수에 있는게 우선순위가 높게 동작하므로 위와 같이 적는게 가능합니다. @GeneratedValue 를 사용합니다. "pk 변경할 일이 생겨서 일주일 정도 작업해야 합니다." 이런걸 1년에 한번 은 듣는것 같습니다. 절대 변경될 일 없을것 같으나, 우린 이미 그건 그저 희망사항일 뿐이라는걸 압니다.

spring 핵심 원리 [내부링크]

아래 강의 내용중 핵심만 간추려서 정리합니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8 스프링 핵심 원리 - 기본편 - 인프런 | 강의 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런... www.inflearn.com #SOLID : 객체지향의 5가지 원칙. OCP 와 DIP 가 특히 중요 #SRP : 단일책임. 하나의 책임이라는게 모호한데, 수정이 필요할때 영향도가 적은것. 즉 적은 클래스만 변경할수록, 클래스내에서도 적은 함수들만 변경할수록 좋은 설계임 #OCP : 개방 폐쇄. 다형성을 통해 구현체의 확장/변경이 쉽고(=확장에 열려있고), 이를 이용하는 코드는 변경되지 않아야 한다.( =변경에는 닫혀있고) L

spring boot mvc 기본 정리 [내부링크]

아래 강의 중 jsp, 타임리프 와 같은 view 를 제외하고 정리합니다. 최근에는 view 보다는 rest api 로 데이터만 내려주고, ui는 #react.js 와 같은 SPA 를 사용합니다. 그래서 admin page 용도와 같이 용도가 제한된 view 부분은 skip 합니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의 소개 | 인프런... www.inflearn.com https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 -

spring boot mvc - servlet 개요 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - spring mvc 호출구조 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - controller 상세하게 알아보기 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - argument resolver, return value handler 그리고 message converter [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - validation ( 입력값 검증 ) 1/2 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - validation ( 입력값 검증 ) 2/2 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

cookie, session, jwt 그리고 sso. 쿠키, 세션, 통합로그인 [내부링크]

보통 사내 시스템을 만들면 사내 SSO ( single sign on )가 이미 구축되어 있기에 이걸 이용해서 로그인처리를 하게 됩니다. 굳이 사내시스템이 아니더라도 같은 계열의 사이트이면, 한곳에서 로그인하면 나머지 사이트는 로그인 추가로 안해도 로그인이 되는 경우가 많습니다. 이 또한 SSO 를 이용했을 확률이 높습니다. 이번 포스팅에서는 sso를 위해 cookie 와 session 를 어떻게 사용하는지 알아보겠습니다. 쿠키와 세션에 대한 내용은 아래 유명한 노마드 아저씨의 영상을 꼭 보시기 바랍니다. 최고의 쿠키 세션 설명 영상입니다. https://www.youtube.com/watch?v=tosLBcAX1vk&t=8s 위 영상 봤다고 가정하고, 중요내용만 정리하겠습니다. 쿠키는 클라이언트(브라우저)에 저장되는 데이터입니다. 아래처럼 id,pw 를 넣어서 로그인시도 하고, 성공하면 서버에서는 Set-Cookie 라는 http 헤더에 쿠키값을 넣어서 리턴해줍니다. 쿠키는 key

spring boot mvc - filter 필터 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - interceptor 인터셉터 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - custom Argument Resolver 만들기 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - 예외처리 #1/2 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot mvc - 예외처리 #2/2 [내부링크]

1. servlet 개요 https://blog.naver.com/semtul79/222660730634 2. spring mvc 호출구조 https://blog.naver.com/semtul79/222661350643 3. controller 상세 정리 https://blog.naver.com/semtul79/222662125630 4. argument resolver, return value handler 그리고 message converter - https://blog.naver.com/semtul79/222664395210 5. validation ( 입력값 검증 ) 1/2 - https://blog.naver.com/semtul79/222667766751 6. validation ( 입력값 검증 ) 2/2 - https://blog.naver.com/semtul79/222669271920 7. filter 필터 - https://blog.naver.com/semtul79/2

spring boot + mybatis - 기본 설정/사용법 [내부링크]

1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring boot + mybatis - parameterType, resultType , typeAlias - https://blog.naver.com/semtul79/222688684376 3. spring boot + mybatis - Transaction - https://blog.naver.com/semtul79/222689712876 4. spring boot + mybatis - log4jdbc-log4j2 - https://blog.naver.com/semtul79/222689762891 5. spring boot + mybatis - multi DB ( 여러개의 DataSource ) - https://blog.naver.com/semtul79/222689953891 #spring #boot 에서 #mybatis

spring boot + mybatis - parameterType, resultType , typeAlias [내부링크]

1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring boot + mybatis - parameterType, resultType , typeAlias - https://blog.naver.com/semtul79/222688684376 3. spring boot + mybatis - Transaction - https://blog.naver.com/semtul79/222689712876 4. spring boot + mybatis - log4jdbc-log4j2 - https://blog.naver.com/semtul79/222689762891 5. spring boot + mybatis - multi DB ( 여러개의 DataSource ) - https://blog.naver.com/semtul79/222689953891 지난 포스팅에 이어 mybatis 에 대해 좀

spring boot + mybatis - Transaction [내부링크]

1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring boot + mybatis - parameterType, resultType , typeAlias - https://blog.naver.com/semtul79/222688684376 3. spring boot + mybatis - Transaction - https://blog.naver.com/semtul79/222689712876 4. spring boot + mybatis - log4jdbc-log4j2 - https://blog.naver.com/semtul79/222689762891 5. spring boot + mybatis - multi DB ( 여러개의 DataSource ) - https://blog.naver.com/semtul79/222689953891 DB 작업을 하다보면 #Transaction

spring boot + mybatis - log4jdbc-log4j2 [내부링크]

1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring boot + mybatis - parameterType, resultType , typeAlias - https://blog.naver.com/semtul79/222688684376 3. spring boot + mybatis - Transaction - https://blog.naver.com/semtul79/222689712876 4. spring boot + mybatis - log4jdbc-log4j2 - https://blog.naver.com/semtul79/222689762891 5. spring boot + mybatis - multi DB ( 여러개의 DataSource ) - https://blog.naver.com/semtul79/222689953891 #mybatis 를 쓸 경우 아래처럼 appl

spring boot + mybatis - multi DB ( 여러개의 DataSource ) [내부링크]

1. spring boot + mybatis - 기본 설정/사용법 - https://blog.naver.com/semtul79/222687917255 2. spring boot + mybatis - parameterType, resultType , typeAlias - https://blog.naver.com/semtul79/222688684376 3. spring boot + mybatis - Transaction - https://blog.naver.com/semtul79/222689712876 4. spring boot + mybatis - log4jdbc-log4j2 - https://blog.naver.com/semtul79/222689762891 5. spring boot + mybatis - multi DB ( 여러개의 DataSource ) - https://blog.naver.com/semtul79/222689953891 #spring #boot #mybatis 시리

spring boot + MDC(threadLocal) + Sleuth ( 로그 trace ) [내부링크]

#spring #boot 에서 각 http 요청별 데이터 저장을 위해 MDC 를 사용하는 방법. spring cloud sleuth 를 이용해서 로그 trace 하는 방법에 대해 사용법 및 원리를 알아보겠습니다. 우선 테스트를 위해 start.spring.io 에서 아래와 같이 프로젝트를 생성합니다. spring boot 버전, java 버전등은 각자 학습하는 시점의 적절한 것을 쓰면 무관합니다. MDC 는 동일 쓰레드 전용 map 자료구조를 제공합니다. 보통 http 요청이 오면 하나의 쓰레드가 할당되고, 그 쓰레드를 통해 #필터, #인터셉터 , #controller , #service , #mapper 등이 수행됩니다. 이런 여러 함수에서 공통으로 필요로 하는 데이터를 공유하려면 전역변수를 쓰거나 각 함수 호출시 파라미터로 넘겨줘야 합니다. 전역변수를 쓸 경우, 동시에 여러 쓰레드가 실행될 경우 데이터가 망가지므로 사용할 수 없고 각 함수 호출시 파라미터로 값 넘겨주려니 너무 귀

spring boot + design pattern ( 디자인 패턴 ) - 템플릿 메서드, 전략, 템플릿 콜백 패턴 [내부링크]

#spring #boot 에서 자주 사용되는 #design #pattern ( #디자인패턴 ) 에 대해 알아보겠습니다. 궁극적으로는 #AOP 와 AOP에서 사용하는 패턴을 설명하기 위한 선행 학습을 위한 포스팅입니다. 구체적으로 MyHttpClient 라는 클래스가 있다고 합시다. 이 클래스는 이름처럼 HTTP 요청을 보내는 client용 라이브러리입니다. 이 라이브러리에는 HTTP 요청시 기본적인 HTTP 헤더 세팅 및 로깅 등 있어야 할 기능들이 모두 구현되어 있습니다. 그러나 예외처리는 실제 사용하는 쪽에서 구현하도록 만들지 않았다고 합시다. 즉 retry를 할건지, 그냥 무시할건지 , 예외를 throw 할건지 등등은 "난 모르겠으니 알아서 해라" 라고 했다고 합시다. 이에 대한 방법은 아래와 같습니다. 첫번째 방법. 상속 - 템플릿 메서드 패턴 public abstract class MyHttpClient { protected abstract void handle(); //

spring boot + design pattern ( 디자인 패턴 ) - 프록시 패턴 [내부링크]

#spring #boot 의 #AOP 는 #프록시패턴 을 이용해서 원본 로직 수행 전후에 로직을 넣습니다. AOP 설명에 앞서 프록시패턴에 대해 알아보겠습니다. #proxy 라는 말은 web 환경에서 많이 들어봤을 겁니다. 원본 사이트의 내용을 cache 하여 proxy 사이트를 여러개 만들어서, 원본 사이트에 접근하는게 아니라, 지리적으로 가까운 proxy 서버로 접속하여 빠른 속도를 보장합니다. 이렇게 사용자 가까운 곳에 위치한 걸 proxy 라고 말하며 사용자 -- 인터넷 -- web server(apache) --- was ( tomcat ) 에서 web server 를 reverse proxy 라고 부릅니다. 사용자를 위한게 아니라 was 를 위한 proxy 라는 뜻이어서 reverse proxy 라고 부릅니다. 암튼 중요한건 이렇게 원본 + proxy 형태로 구성되어 있습니다. 그리고 모든 요청은 원본에게 바로 가는게 아니라 proxy 를 거친다는 겁니다. 중요! 개념은

spring boot + proxy 기술 ( reflection, jdk 동적프록시) [내부링크]

#spring #boot #AOP 에 사용되는 proxy 기술 전반에 대해 다뤄보겠습니다. #reflection 에 대해 우선 알아봅시다. reflection 은 C/C++ 의 포인터처럼 막강한 기능을 제공합니다. 그만큼 잘못쓰면 디버깅도 어렵다는 말이기도 합니다. 일반적인 application을 개발할때는 리플렉션을 쓸 이유가 없습니다. 만약 쓰고 있다면 정말 이게 필요한건지 생각해봐야 합니다. 보통은 프레임워크와 같이 어떤 app 과 함께 쓰일지 모르는 상황에서 유연하고 동적인 처리를 위해 리플렉션을 사용합니다. test 클래스 하나에 아래 코드들을 넣어서 테스트 해보겠습니다. // 어노테이션 여부에 따라 동작을 다르게 할것이라서 임의의 어노테이션 생성 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) static @interface MyAnnotaion { } 위와 같이 임의의 어노테이션을 하나 만들었습니다. 쓰임

spring boot + proxy 기술 ( CGLIB ) [내부링크]

이번 시간에서는 인터페이스 없이 구체클래스만 있는 경우 #CGLIB 이라는 오픈 소스를 이용해서 proxy 를 만드는 방법에 대해 알아보겠습니다. 동적 jdk 프록시에는 아래 인터페이스를 이용해서 프록시를 만들었습니다. CGLIB 에서는 아래 인터페이스를 이용합니다. 패키지명을 보니 springframework 의 것입니다. 원래는 오픈소스인데 스프링에서 내장시켰습니다. 그래서 따로 의존성을 넣을 필요가 없습니다. 메서드의 모양이 동적 jdk 프록시와 유사합니다. 파라미터로 수행할 함수 정보를 받아오고 실행결과를 Object 타입으로 리턴합니다. 즉 템플릿콜백 패턴과 유사하게 파라미터를 통해 수행할 함수 정보를 받아오는 방식입니다. 스프링에서는 CGLIB 을 직접 사용해서 프록시로 만들 필요가 없습니다. 편리하게 사용하라고 #ProxyFactory 를 제공해주고 있고 이걸 통해서 동적 JDK 프록시나 CGLIB을 통한 구체클래스 프록시를 모두 만들 수 있기 때문입니다. 여기서는 사용

spring boot + proxy 기술 ( ProxyFactory ) [내부링크]

인터페이스 기반 동적 JDK 프록시와 구체 클래스기반 CGLIB 에 대해 알아봤습니다. 인터페이스 기반 클래스는 동적 JDK 프록시를 써야 하고, 구체 클래스만 있는 경우는 CGLIB 를 써야 했습니다. 즉 if ~ else 처럼 클래스를 확인하고 필요한 기술(라이브러리)을 써야 했습니다. 스프링에서는 #ProxyFactory 라는걸 제공해서 이 클래스가 원본 target 을 확인하고 스스로 동적 JDK 프록시 혹은 구체 클래스기반 CGLIB을 이용해서 proxy 를 만들어줍니다. ProxyFactory 에서는 아래 인터페이스를 이용합니다. CGLIB 때와 같은 이름의 인터페이스이나 패키지명이 다릅니다. aop 어쩌구 저쩌구 클래스입니다. 앞의 포스팅을 쭉 봤다면 이젠 보자마자.. "대충 알겠음" 이라는 생각이 들겁니다. 아래와 같이 구현합니다. 이전과 다르다면 원본 target 을 생성자 주입받았는데 여기서는 그 부분이 없습니다. invoke() 라는 메서드의 파라미터로 원본 ta

spring boot + proxy 기술 ( ProxyFactory, pointcut, advice, advisor ) [내부링크]

이전 포스팅에서 #ProxyFactory에 대해 알아봤는데 #AOP 에서 자주 사용하는 #pointcut, #advice, #advisor 에 대해 좀 더 알아보겠습니다. pointcut : 포인트컷, 대상 클래스 / 대상 메서드 즉 프록시를 적용할 대상을 뜻합니다. advice: 어드바이스, 프록시 코드를 뜻합니다. 즉 캐시, 로깅 등 프록시 용도로 추가한 코드를 뜻합니다. advisor: 어드바이저, pointcut + advice 를 묶어서 advisor 라고 합니다. 어디에 어떤 코드를 넣을지 .. 이렇게 "어디에.. " 와 "어떤 코드를... " 이 조합되어야 프록시가 완성되므로 역할에 맞게 용어를 분리하였고 하나로 뭉쳐야 실제 의미가 있으니 뭉친걸 advisor 라고 합니다. 지난 포스팅에서 ProxyFactory 를 통해 프록시를 만들었는데, 프록시는 프록시 메서드가 아니가 아니라 프록시 클래스 입니다. 즉 클래스 단위로 만들어집니다. 만약 OrderService 라는

spring boot + proxy 기술 ( BeanPostProcessor ) 빈 후처리기 [내부링크]

proxy 사용시 원본 target 과 proxy 객체, 이렇게 2가지가 생성됩니다. proxy는 빈에 등록되어야 하고 원본 target 은 new 로 생성만 되어야 하지 빈으로 등록되면 안됩니다. 직접 수동으로 target 은 new 로 생성만 하고 , proxy 는 빈으로 등록하고... 식으로 구현할 수도 있으나 spring 에 등록되려는 모든 빈 들중에서 proxy 대상이 되는 빈만 골라서 proxy 를 new 하고 이를 빈으로 등록해주는 작업을 해주면 좋겠습니다. 즉 생성된 객체가 빈으로 등록되기 직전에 그 객체 대신 proxy 객체를 빈으로 등록해주는(=바꿔치기하는) 기능이 있습니다. BeanPostProcessor 라는 인터페이스가 있는데 이걸 구현하면 spring boot 에서 빈들이 등록되기 전을 후킹해서 뭔가 처리를 해줄수 있습니다. 아래처럼 BeanPostProcess 를 implement 한 클래스를 빈으로 등록해줍니다. import lombok.extern.sl

spring boot + proxy 기술 ( @Apsect AOP ) [내부링크]

이전 포스팅에서 Advisor 를 직접 빈으로 등록하면 AnnotationAwareAspectJAutoProxyCreator 라는 빈후처리기가 proxy 로 등록해주는걸 알아봤습니다. 스프링에서는 이 방식보다 더 편리한 @Aspect 라는 어노테이션을 통해 proxy 를 적용할 수 있습니다. 간단히 그림으로 아래처럼 표현할 수 있습니다. <출처: 인프런 - 김영한 강사님의 스프링 핵심원리 - 고급편 교재 > 위와 같이 @Aspect 라고 클래스에 적어주면 빈후처리기에서 "이 클래스의 코드를 기반으로 advisor 를 만들어야 겠다" 라고 판단하고 advisor를 생성하고 proxy 까지 생성해서 빈으로 등록해줍니다. 코드로 한번 알아보겠습니다. 기존에 만든 Advisor 등의 proxy 코드들은 주석처리 혹은 삭제등을 해주세요. @Aspect 라고 적어줘야 빈후처리기에서 Advisor 및 proxy 생성을 해줍니다. 빈후처리기에서 처리되려면 빈이어야 합니다. 따라서 @Componen

spring boot + proxy 기술 ( AOP, weaving, aspectJ, join point, pointcut, target, advice, ... ) [내부링크]

app을 개발하다 보면 "아~ 여러군데에서 같은 코드가 실행될 곳이 많네. 함수를 하나 만들고 이걸 필요할때마다 호출하도록 해야지.." 라는 생각이 들때가 많습니다. 상세코드 복붙보다는 함수로 하나 만들고 함수호출 코드만 복붙하는게 좀 나은 방법이긴 합니다. 그러나 여러 메서드의 실행시간을 로깅하고 싶을 경우, 위 방법으로 하면 메서드 앞부분에 시작시간용 코드, 메서드 뒷부분에 시간계산용 코드, 이렇게 2군데 넣어야 합니다. 게다가 예외가 발생해도 일괄되게 동작하려면 try ~ catch 도 넣어야 합니다. 이런 어려움이 있으며 이를 해결하기 위해 나온 것이 #AOP 입니다. < 출처: 인프런 - 김영한 강사님의 스프링 핵심원리 - 고급편 교재 > 위와 같이 별개의 클래스들이지만 공통적으로 로그 추적 로직을 넣고 싶을때, AOP 를 이용하면 이런 횡단 관심사 부분에 공통 로직을 적용할 수 있습니다. OOP 에서 부족한 부분을 AOP를 통해 보조/보완 해줄수 있게 되었습니다. AOP

spring boot + proxy 기술 ( AOP 구현 ) [내부링크]

이제 실제 spring boot 에서 #AOP 를 구현하는 방법에 대해 알아보겠습니다. 가장 간단한 형태는 아래와 같습니다. @Aspect 를 넣어서 advisor 대상임을 표시하고 @Component를 통해 빈으로 등록합니다. @Around 를 통해 pointcut 을 지정해주고 바로 아래 메서드를 통해 advice 를 정의합니다. @Slf4j @Aspect @Component public class LogAspect { @Around("execution(public * dev.developery.mdc.reflection..*(..))") public Object advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { StopWatch sw = new StopWatch(); sw.start(); ////// 여기가 원본 target ////////// Object result = proceedingJoinPoint.

spring boot + proxy 기술 ( pointcut, 포인트컷 ) [내부링크]

AOP 적용 지점을 가리키는 #포인트컷(#pointcut) 을 실습을 통해 자세히 알아보겠습니다. 아래와 같이 의존성을 넣어줍니다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 포인트컷 테스트를 할 인터페이스를 아래처럼 하나 만듭니다. package me.test.intellij.service; public interface TestService { String dummyMethod(String name); } 위 인터페이스를 implement 한 클래스도 하나 만듭니다. package me.test.intellij.service; import org.springframework.stereotype.Service; @Service public class TestServiceImpl implements TestServ

spring boot + proxy 기술 ( AOP 활용기술 + 주의사항#1 ) [내부링크]

#spring #boot #proxy 기술 시리즈 마지막 편입니다. #AOP 를 활용해서 사용되고 있는 실제 기술들, 그리고 실제로 쓸만한 AOP 예제, 마지막으로 제약사항에 대해 알아보겠습니다. #Retryable 이라는 어노테이션이 있습니다. 이걸 통해 특정 메서드에서 exception 발생시 여러번 retry 해주는 어노테이션입니다. AOP 설명을 위해 @Retryable 사용법을 잠시 살펴보겠습니다. 아래처럼 retry 하고 싶은 메서드에 @Retryable 을 적어두고 value 에 retry 대상 Exception 을 적어줍니다. 대상 메서드를 보니 현재 시간(ms)이 5의 배수이면 성공, 그외이면 RuntimeException을 발생하도록 했습니다. retry 되는걸 봐야 하므로, 확률적으로 80% 예외가 날라가게 해두었습니다. import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.En

spring boot + proxy 기술 ( 주의사항, 제약사항 #2 ) [내부링크]

이제 프록시 기술의 한계점에 대해 알아보겠습니다. JDK 프록시와 CGLIB 프록시.. 이렇게 2가지 방법이 있으며 spring boot는 기본적으로 CGLIB 프록시를 이용합니다. 만약 JDK 동적 프록시를 쓰고 싶다면 아래처럼 proxyTargetClass 에 false 로 세팅하면 됩니다. ( 이 부분은 이전 포스팅에서 모두 다루었던 내용입니다. ) Retry target = new Retry(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.setProxyTargetClass(false); // 여기를 false 로 세팅하면 JDK 동적 프록시로 생성 Retry retryProxy = (Retry)proxyFactory.getProxy(); JDK 동적 프록시는 인터페이스 기반으로 동작합니다. 만약 아래 4번째 코드처럼 프록시객체를 인터페이스가 아닌 구체 클래스로 타입 캐스팅을 하면 Exception

[도서후기] 소프트웨어 아키텍처 101 [내부링크]

yes24 에서 아래처럼 꽤 인기있고 평이 좋은 #소프트웨어 #아키텍처 서적에 대해 후기 + 내용 요약을 해보겠습니다. 한줄 후기 일반 개발자입장에서 아키텍트에 대한 이해를 할 수 있었고, 언젠가 될수도 있는 아키텍트 라는 role 을 위해 어떤 걸 준비해야 하는지, 이런 저런 기술을 깊게 아는게 전부가 아닌 기술을 넓게 알고, 인간관계와 같은 비 기술적 요소도 점점 중요해져 가는걸 알게되었습니다. 개인적으로 여전히 "좁지만 깊게 알아야 하는" 일반 개발자가 좀 더 매력적으로 느껴지지만, 시간이 흐르면서 자연스레 아키텍트쪽으로 더 많은 관심이 가져지지 않을까 생각해봅니다. 아래부터는 제 기준에서 중요하거나 복습(?)에 도움된다고 생각되는걸 요약했습니다. 책내용+개인생각을 적었기에 일부 잘못된 내용이있을수도있습니다 기술도 중요하나 대인관계/처세술도 필요하다 아키텍트에게 필요한 것은 다양한 경험을 쌓아왔고, 최신 트렌드를 잘 알고, 아키텍처를 잘 분석할줄 알고, ... 와 같은건 사실

CORS + basic authentication in spring boot [내부링크]

spring boot 에서 #http #basic #authentication 을 적용하고 #react, vue 와 같은 #frontend 에서 #axios 등으로 json 형식의 body를 http request 를 보냈을때 CORS 에러가 나는 원인과 그 해결책에 대해 정리합니다. #CORS 는 너무나 유명하니 구글에서 CORS 라고 검색하면 자세하게 나오니 그걸 참고하시고 spring boot 에서 http basic authentication 적용하는 것도 구글링하면 차고 넘기게 나오니 그걸 참고하세요. 이번 포스트에서는 react, vue 와 같이 spring boot 에서 제공하는 ui 가 아니라, 별도 서버 혹은 프로세스에서 제공되는 ui 에서 spring boot로 HTTP request 를 보낼 경우 CORS 문제가 발생하는데, 이렇게 인증 + CORS 가 복합된 것에 대해 해결하는 방법에 대해 기술합니다. axios 같은 javascript의 http 라이브러리에서