전체 글

전체 글

    3. 프로그램의 기계수준 표현 ~ 3.4 정보 접근하기

    3.0 개요gcc c 컴파일러는 기계어 커드를 문자로 표시히는 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각인스터럭션을 만들어낸다. 그러고 나서, gcc는 어셈블러와 링커를 호출하여 어셈블리 코드로부터 실행 가능한 기계어 코드와 기계어 코드의 읽기 쉬운 형태인 어셈블러 코드에 대해 자세히 살펴본다. 자바를 포함한 c언어는 고급 언어로써 컴파일하면 잘 훈련된 컴파일러 개발자만큼의 코드를 만들어준다. 거기다 기계에 의존적이라 재활용이 힘든 어셈블러와 달리 고급 언어는 다른 많은 컴퓨터에서도 실행이 가능하다(즉, 추상화가 잘 되어있다). 또한 타입 체크 등 프로그램 에러에서도 도움을 준다. 그런데도 왜 기계어를 배워야 하는가? 이는 프로그램 최적화와 동작 방식을 이해하는 데 있다. 고급 언어의 컴파일러로..

    쿠버네티스 입문 책 읽고 생각 정리

    Part1 쿠버네티스 시작하기1. 쿠버네티스 소개1.3 쿠버네티스1.3.1.2 기본 사용법kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080후kubectl expose po echoserver --type=NodePort 하는걸 보면, 서버를 만드는 것 따로, 여기에 접근하게 하는 서비스 따로 하나 보다.(라고 생각했지만, 내부와 격리된 컨테이너에 접속 가능하게 expose를 해서 그랬던 것) 1.3.2 디플로이먼트를 이용해 컨테이너 실행하기실행 방법이 크게 2가지인데, kubectl run 명령은 직접 컨테이너를 실행하는거고 다른 하나는 yaml 형식으로 저장된 걸 실행하는 거라고 한 거 보면 딱 봐도 yaml이 정형화 시킬 ..

    깊이와 에너지 집중의 필요성

    카페에서 클린아키텍쳐 책에 8장 OCP 개방 폐쇄 원칙을 보고있는데 클래스 연결 구조들을 정리한 내용을 보며 문득 든 생각들이다.  의존 변화 관계에서 독립하기 위해 DI를 사용하는데 안의 구체적인 인스턴스 내용은 모른 체 인터페이스만 사용하여 의존하지 않기 위함이다. 그래서 언어에서 인터페이스가 있는 것이고, 자바에선 인터페이스, c계열 언어에선 헤더파일이 있는 것. 그래서 이런 분리관계 자체는 탄생부터 있어왔다. 여기까지 생각이 드니 자연스럽게 과거에 배우고 알았던 것들과 연관관계가 생기면서 생각이 더 깊숙하게 들어갔는데, 그래서 해당 카테코리를 만들었다. 생각해보면 그래서 김영햔 스프링 강의에서 인터페이스를 사용하는 대표적인 이유가 바로 저거였다. 내가 배우려고 하는 rust 언어에서도 pub st..

    만든이유

    책 읽으며 생각을 정리하는데 문득 너무 많은 생각들이 들어서 분명히 잊어버릴 것 같다.그래서 어딘가에서라도 기록하는게 좋을 것 같다.

    1335. Minimum Difficulty of a Job Schedule 풀이 python

    https://leetcode.com/problems/minimum-difficulty-of-a-job-schedule/ Minimum Difficulty of a Job Schedule - LeetCode Can you solve this real interview question? Minimum Difficulty of a Job Schedule - You want to schedule a list of jobs in d days. Jobs are dependent (i.e To work on the ith job, you have to finish all the jobs j where 0 int: N = len(jobDifficulty) if d > N: return -1 dp = [[-1] * (..

    스프링 핵심 원리 - 고급편 - 섹션13. 스프링 AOP - 실무 주의사항

    실제로 사용하다가 겪을 수 있는 경우의 수들 일단 프록시 클래스를 내부 호출 했을 때 프록시 적용 안되는 문제 프록시를 하고 있는 클래스인데 이 클래스 안에서 자신의 내부 함수를 직접 호출하고 있다면 여기엔 프록시가 적용되지 않는다. 외부에서 하면 프록시의 함수를 실행하므로 당연히 된다. 참고로 이건 AspectJ 프레임워크를 쓴다면 이렇게 스프링 AOP처럼 프록시 클래스를 만드는게 아닌 저 클래스 함수 안에 코드를 직접 쓰기 때문에 이런일이 없다. 하지만 설정이 너무 복잡하고 이걸 스프링 AOP로 해결할 수 있는 방법도 많아 거의 쓰지 않는다. 그래서 클래스 내부에서도 자기 함수를 직접 불러오는게 아닌 자신도 프록시 클래스의 함수를 사용하도록 바꿔보자. 생성자로 받으면 아직 빈에 생성되지도 않은 걸 받..

    스프링 핵심 원리 - 고급편 - 섹션12. 스프링 AOP - 실전 예제

    앞에서 배웠던 거 실제로 쓰기 실패할 시 자동으로 재시작 하는 로직을 어노테이션으로 해보자. 요새 이러는게 추세라고 함. 일단 여기에 로그용 어노테이션 @Trace를 만들어서 적용해보자. 어노테이션 @Trace가 붙어있다면 이 프록시를 만들어 적용해라. 를 원하는 함수에 붙여준다. 잘 된다. 이제 @Trace말고 재시작 하는걸 해보자. 잘 된다. 이제 어느 함수가 시간이 오래걸릴 때 경고 뜨게 한다던지 하는 식으로 창의적으로 활용하면 된다. 좋은건 한번 잘 만들어두면 어느 메소드나 클래스에서든 재활용할 수 있다.

    스프링 핵심 원리 - 고급편 - 섹션11. 스프링 AOP - 포인트컷

    은근슬적 포인트컷 지시 문법들 그냥 넘어갔었는데 이번에 다룬다. execution을 가장 많이 사용하고 나머지는 자주 사용하지는 않아 execution 위주로 볼거다. 기반 및 테스트코드 작성 MemberService 클래스 인스턴스를 만들어 거기에 hello라는 함수를 가져온 모습이다. 이걸 기반으로 포인트컷 문법들을 본다. @Slf4j public class ExecutionTest { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); Method helloMethod; @BeforeEach public void init() throws NoSuchMethodException { helloMethod = MemberServic..

    스프링 핵심 원리 - 고급편 - 섹션9,10. 스프링 AOP 개념,구현

    지금 문제가 뭐냐면 실제로 비즈니스 기능을 수행하는 핵심 기능과 로그를 남기는 부가 기능으로 나누는데, 이런 부가 기능은 대체로 여러 클래스에서 쓰일 확률이 높다. 그래서 여러 클래스에 거쳐 사용되기 때문에 횡단 관심사라고 하고, 때문에 사용하려면 각각의 클래스마다 복붙을 해야 한다. 현실적으론 복잡해지는데, 원하는 클래스마다 함수를 써서 넣어야 하고 이걸 유틸같은 함수로 정의해서 사용해도 결국은 안의 코드를 수정해야 한다. 왜냐하면 핵심 기능을 감싸는 코드여야 하기 때문 이 문제를 해결하기 위해 스프링에서 AOP를 지원한다. 이런 고민은 특정 앱을 만든 한명이 아닌 보통 만들때 고민하는 문제들이라 아얘 지원하는걸 만들었다. @Aspect인데, 지금까지는 클래스 각각 하나를 보면서 앱을 만들었다면, 횡단..