일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- nestjs스터디
- 플러터 개발
- JPA스터디
- JPA
- 프로그래머스
- DDD
- JPA 공부
- 자료구조공부
- 스프링부트
- nestjs공부
- 코테공부
- JPA예제
- 알고리즘공부
- 스프링부트공부
- JPA공부
- Flutter
- 플러터 공부
- Axon framework
- K8S
- 카프카
- Kafka
- nestjs
- 기술공부
- 스프링공부
- querydsl
- 자바공부
- 스프링
- 코테준비
- 기술면접공부
- 스프링 공부
- Today
- Total
목록분류 전체보기 (715)
DevBoi
Java 프로그램이 시작되면 Java Virtual Machine이 운영체제에서 일부메모리를 가져온다. JVM은 모든 요구사항에 대해서 이 메모리를 사용하며, 이메모리의 일부는 java 힙 메모리라고 한다. 힙은 동적데이터가 할당되어 저장되는 공간이고, GC 동작 대상이다. 힙 메모리의 구조에 대해서 알아보자 처음 객체가 생성되면, Eden 영역에 위치한다. 정기적인 GC이후에 남은 녀석을 Survivor Space로 이동하고 특정 age가 넘으면 OldGeneration에 이동한다. 여기서는 Major GC가 적용된다. permanent영역이고, 클래스 로더에 의해 로드된 클래스들이 저장되는 공간이다. JDK 8부터는 해당 영역이 MetaSpace영역으로 교체 되었다.
JVM C/C++은 컴파일 플랫폼과 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않는다. 크로스 컴파일 : 타겟 플랫폼에 맞춰서 컴파일을 하는 것이다. JVM은 java 소스를 컴파일 하면, 자바 바이트코드로 만들어준다. 자바 바이트코드는 Jvm이 설치된 플랫폼이면 다 정상 작동한다. Java 프로그램 동작과정 1. 프로그램이 실행되면, JVM은 OS로 부터 이 프로그램이 필요한 메모리를 할당 받는다. 2.자바 컴파일러가 자바 소스코드를 읽어, 해당 소스코드를 자바 바이트 코드로 컴파일한다. 3.Class Loader가 동적로딩을 통해 class파일들을 동적 로딩 및 링크하여 런타임 데이터 영역, JVM메모리 영역에 올린다. 4.Execution Engine이 메모리에 올라간 class들을 기계어로 변경..
JVM : 메모리 관리 및 가비지 컬렉터 기능을 수행한다. 가비지 컬렉터 : 동적으로 할당된 메모리 영역중 사용하지 않는 영역을 탐지하여 해제하는 기능이다. 동적으로 할당되었다고 하면, Java의 힙을 얘기하는 것이다. Stack : 정적으로 할당된 메모리 영역 원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object타입의 데이터 참조값 할당 Heap : 동적으로 할당된 메모리 영역 모든 Object 타입의 데이터가 할당 Heap영역의 Objecet를 가리키는 참조 변수가 Stack에 할당 쉽게 얘기해서, 저 메인 메소드 내의 로직이 처리 될때 Stack : 원시타입은 값 저장, Wrapper클래스는 참조값만 저장한다. Heap : Object 하위 상속 받는 모든 객체들의 값이 담긴다..
스프링의 동작과정을 살펴보자 1. WAS가 구동되면 web.xml을 로딩한다. 2. 로딩된 web.xml에서 ContextLoaderListener 클래스를 생성한다. 3. 생성된 ContextLoaderListener는 root-context.xml을 로딩한다. 이때 root-context는 Context-param으로 선언 되었기 때문에 WebApp 전역적으로 사용한다 4. 로딩된 root-context에 선언되어있는 service,dao등의 객체가 생성이 된다. DispathcherServlet이 구동된다. 이때 Servlet으로 구동되었기 때문에 해당 부분에서만 사용가능한 Context가 된다. 해당 DispathcherServlet이 구동되면서 servlet context를 불러온다. 등록된 s..
제네릭은 일반적인 이라는 이름, 뭐이름은 중요하지 않고 클래스 내부에서 지정하는 것이 아닌 , 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로, 특정 타입을 미리 지정해주는 것이 아니라 필요에 의해 지정할수 있도록 하는 일반 제네릭 타입이라는 것이다. 제네릭의 장점 - 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할수 있다. - 클래스 외부에서 타입을 지정해주기 때문에 타입을 체크하고 변환해줄 필요없이 관리가 편하다. - 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다. 제네릭을 실제로 구현하고있는 것을 예시로 한번 생각해보자 우리가 많이 쓰는 ArrayList가 있다. 이걸 만들고있는 라이브러리를 보면, 제네릭으로 구현이 되어있다. 우리는 ArrayList,..
Member와 Member 하위의 Team이라는 객체가 있다고 가정해보자 그리고, Member와 Team 을 둘다 받는 메소드가 있고, Team은 필요없이 Member만 필요한 경우를 생각해보자 실제로, 저장하고 find할때, Insert, select 가 된다. 만약에 이렇게 , find가아니라, getReference로 불러올때는 사용하지않으면, select 쿼리, 즉 db에서 조회하지 않는다. 어떻게 가능할까? 우선 getReference로 하면, 하이버네이트에서 내부에서 가짜 엔티티(프록시) 가 만들어진다. 이 가짜 엔티티는 실제 클래스를 상속 받아 겉모양은 같지만, 내부의 값들이 텅텅 비었다. 쉽게 말하면, 키를 가지고 디비를 조회할수 있게끔 아이디값만 가지고 있는 가짜 텅빈 엔티티라고 생각하면..
컴포넌트 탐색, 스프링 애플리케이션이 실행되면, 모든 빈은 애플리케이션 컨텍스트에 등록이 된다. 실제로 이제 코딩을 시작해보자 1.ServerController 해당 컨트롤러에서는 서비스에 대한 주입과, 다량의 특정 객체를 반환하는 메서드, 그리고 그 메서드는 서비스의 getDish를 통해서 반환한다. 그리고 produces에서 텍스트 이벤트 스르팀 벨류라는 미디어 타입이있는데, 해당 은 서버에서 주는 스트림을 쉽게 소비한다. 미디어 타입에 대한건 다른 포스팅에서 다뤄보자 2. kitchenService @Service는 해당 서비스를 스프링 빈에등록하기 위함이다. 아까 컨트롤러에서 사용한 getDishes() 메소드는, randomDish를 통해 랜덤으로 호출된 것을 return 한다. generate..
인덱스 동작과정에 대해서 알아보자 RDBMS에서 대용량으로 데이터가 있을때, 해당 데이터를 full scan하는 것이아니라 특정 컬럼들을 키로, 해당 데이터들을 가지고있어서, 필요할때 range scan을 하면서 검색 효율을 높이는 것이다. range Scan이란, 특정 위치에서 검색을 시작해, 일치 하지 않는 범위를 만나면 멈추는 것을 의미한다. 가장 일반적인 인덱스 는 비트리 형태로 이루어져 있다. 비트리(B-tree)란? * 모든 리프 노드들이 같은 레벨을 가질수 있도록 관리되는 이진 트리이다. 비트리에서의 탐색과정은, 검색 대상을 key와 비교하고, 해당 key보다 크면, 더 큰 key값으로 이동하여, 범위에 맞는 예를 들면, 10,20이 키면, 18검색시에, 10과 20사이의 key값에 해당하는..
1. Start.spring.io 접속, 몇몇 필요한 의존성들을 추가해주고, 해당 추가 사항을 바탕으로 프로젝트를 생성, 이클립스에서 해당 프로젝트를 오픈해준다. parent에서는 그룹아이디나 버전에 대한 정보가 들어가있다. 그리고 해당하위에는 java 버전, 또한 프로젝트 속성값들에 대한 내용들이 있다.
리액티브 프로그래밍을 써야할 정도의 대규모 서비스가 많지 않았다. 작은 서비스의 서버에서, 대규모에 대한 걸 처리하려면 단순히 서버를 더 투입하면 되지 라는 생각이지만 사실 요새는 그렇지 않다. 작은 스타트업도 대규모의 데이터를 처리해야한다. "기존 자원을 더 효율적이고 일관성 있게 사용하는 방법?" -> 리액티브 스트림이다.(수요 조절에 기반한다.) 논블로킹, 비동기 프로그래밍 모델 함수형 프로그래밍 스타일 스레드를 신경 쓸 필요 없는 동시성 또한 메소드 처리 이후에, doOnNext,doOnError,DoOnComplete 등을 사용해서, 해당 이벤트 이후를 핸들링 할수 있다. 리액티브 프로그래밍에서 가장 중요한 두개의 개념을 알아야한다. publisher - 서비스를 발급해주는 사람 subscrib..