분류 전체보기 90

객체의 메모리 레이아웃과 Heap(JVM)

너무 많은 양의 자료가 오히려 혼란스럽게 한다. 객체의 메모리 레이아웃은 만들어지는 객체의 구조라고 보면된다. 해당 구조의 형태로 Heap이라는 곳에 저장이 된다. Heap은 이전 글에서도 여러번 적었듯 아래와 같은 형태이다.GC가 발생하는 과정을 시각화한 것이라 착각했었다. 위의 이미지가 Heap 메모리 구조이고 객체가 만들어졌을때 객체의 메모리 구조의 형태로 Eden이라는 곳에 들어가게 되는 것이다 객체의 메모리 레이아웃( = 객체의 구조) 위 두 이미지 같은 것이니 이해하기 편한 걸 보면 된다. 객체라는 것은 단순히 인스턴스 데이터의 집합만이 아니다. 여러 정보들이 모여서 하나의 객체를 이루고 있는 것이다.Mark Word(마크워드)Markword는 해시 코드(hash code), 락 플래그(l..

언어/java 2026.01.23

Runtime Data Areas(JVM)이란?

바이트 코드(=클래스 파일)을 ClassLoader를 이용해 메모리(Runtime data area)에 실행 가능한 상태로 적재한다. 구성요소 Method Area, Heap,PC Registers, JVM Stacks, Native Method Stacks으로 구성된다. Heap과 Method Area는 각각의 스레드가 메모리를 공유한다.Method Area클래스에 대한 정보가 올라오는 영역으로 모든 쓰레드가 공유함. Static영역프로그램 실행 중 클래스나 인터페이스를 사용하게 되면 JVM은 ClassLoader에게 요청하여 클래스와 인터페이스의 메타데이터를 Method Area에 저장한다.클래스에 대한 정보가 이 영역에 존재하기 때문에 인스턴스를 생성하기 위해서는 Method Area를 참조해야..

언어/java 2026.01.21

JVM의 Class Loader(클래스 로더)란?

왜 알아야 할까?클래스 로딩때 발생하는 이슈를 해결할 수 있고 코드 상에서 동적으로 클래스를 로딩하는 구문을 이해할 수 있으며, java의 동작 방식에 대해 한층 깊게 알수 있다. java의 빌드 과정"Build"는 우리가 작성한 코드를 실행 가능한 형태로 만드는 작업을 말한다. Java에서는 build하기 위해 아래의 과정을 거치게 된다.생성할 코드가 있는 경우 코드 생성 (Lombok, Object Mapping ... )소스 코드 컴파일 (.java -> .class 확장자 변경, cmd에서 javac 명령어와 같은 동작)테스트 코드 컴파일테스트 실행패키징 (jar, war ...) Java의 Class Loader는 이제 이 class들을 JVM에 로드하는 역할을 수행@@JAR(JAVA Arch..

언어/java 2026.01.19

스프링 Controller,Service,Repository 동작 구조 정리

인프런 김영한의 강의를 듣고 코드를 다 작성한 후 코드가 어떤식으로 동작하는지 하나하나 분석해봄. 스프링의 계층 구조를 도형의 모양에 따라 구분해놓았다. 정리한 구조를 보니 아주 복잡하다. 알아야 하는 부분이 한참 남았지만 시각적으로 표현해놓으니 머릿속으로 정리가 된다. Member는 DB 테이블과 1:1로 매핑되는 자바 객체(Entity) 다JPA가 이 객체를 기준으로 테이블과 매핑한다. MemberRepository를 인터페이스로 두고 JpaMemberRepository나 SpringDataMemberRepository에서 implements를 받아서 다양하게 바꿀 수 있다.구조를 그대로 두고 내가 사용할 기능이 JPA인지 SpringData JPA인지에 따라 바뀔 수 있다. Reposit..

JVM이란? 메모리 구조!

JVM(java virtual machine)간단하게 자바를 돌리는 프로그램 정도로 알고 시작하자. JVM을 사용하면 자바 프로그램을 모든 플랫폼에서 제약 없이 동작하도록 할 수 있다는 점이 가장 큰 장점이다. 왜 jvm이 필요할까? java는 os에 종속적이지 않다는 특징을 가지고 있다. os에 종속적이지 않다는 것을 c언어와 비교를 통해 알아보자 c언어의 실행c언어를 실행하면 컴파일러가 기계어(Binary code,기계가 읽을 수 있는 이진 코드)로 바꾸어주고 컴퓨터가 이해되게 한다. 하지만 이 기계어는 특정 OS나 CPU구조에 맞춰진 컴파일러에 의해 다르게 컴파일 된다는 특징이 있다. ==>> 다른 환경의 기기(다른 os, cpu)를 사용하는 환경에서는 이 기계어를 이해할 수 없다는 것. 이를..

언어/java 2026.01.14

안드로이드 스튜디오에서 Websocket과 연결하기 (프론트)

어떤 유저가 로그인을 성공했을시에 websocket과 연결이 될 수 있게 구현했다.  mainactivity파일composable("login") { LoginScreen( viewModel = authViewModel, onLoginSuccess = { #로그인을 성공했을 경우에 val userId = authViewModel.getUserId() // ViewModel에서 사용자 ID 가져오기 val intent = Intent(this@MainActivity, ManageService::class.java).apply { putExtra("USER_ID", userI..

카테고리 없음 2025.04.02

celery beat와 UTC시간 (오류 해결)

celery beat를 이용해서 내가 원하는 알람시간의 스케줄을 저장하고 해당 알람시간이 되면 tasks.py를 실행시키는 코드를 짰다. 하지만 도저히 task.py가 실행되지 않았다. beat가 연결이 안되서 그런가 싶어서 테스트 코드를 작성했다. #celery.pyapp.conf.beat_schedule = { 'test_periodic_task': { 'task': '앱이름.tasks.test_periodic_task', 'schedule': crontab(minute='*/10'), #timedelta(seconds=10) #minute=1 그냥 이렇게 적으면 매 1분이라는 시각에만 동작하는 것. 8시1분 9시1분 이런식 },}@shared_taskdef te..

카테고리 없음 2025.03.25

Celery beat 사용

주기적으로 코드를 확인하는 기능을 구현하기 위해서 celery beat를 사용했다.(celery를 사용하기 위한 기본 설정은 이전 글에 있으니 참고하시면 됩니다.) #config/celery.py.....app.conf.timezone = 'Asia/Seoul'app.conf.beat_schedule = { 'test_periodic_task': { 'task': '앱이름.tasks.task이름', 'schedule': crontab(minute='*/1'), #timedelta(seconds=10) },}#minute=1 그냥 이렇게 적으면 매 시간의 1분에 동작하는 것. 8시1분 9시1분 이런식 예시 tasks.py입니다.from celery import sha..

카테고리 없음 2025.03.24

Django에서 celery+redis

지금 공부하는 과정이라 해당 글은 계속해서 수정이 될 예정입니다. 지금은 제가 이해한 것 까지만 정리하고 올리는 것이니 아래에 참고한 사이트를 첨부했으니 그것을 보시는게 더 도움이 될 것입니다. Celery를 장고에서 사용하기 위한 흐름을 글로 정리. 1. Django, Redis, Celery 패키지를 설치한다.2. docker를 설치하여 redis서버를 실행시킨다. 사용 환경 : vscode에서 Django를 사용함.vscode에서 redis가 잘 연결이 되었는지 확인하는 방법# redis docker 실행(해당 코드를 vscode 터미널에서 실행)docker run -d -p 6379:6379 redis #실행이 되고 있는 docker의 정보를 알수 있다.docker ps#위의 docker ps를 ..

카테고리 없음 2025.03.23

FCM 사용

안드로이드 스튜디오와 장고 서버를 REST로 연결.  원래 FCM token은 각 디바이스 당 하나의 토큰을 만든다. 여기서 문제점 몇가지를 생각할 수 있었다.한 디바이스에서 여러 유저가 사용하게 될 경우, 혹은 한 유저가 여러 디바이스에서 사용하게 될 경우 FCM token을 이용해서 push알림을 전송을 해야 하는데 유저마다 token값이 동일하게 된다면 a라는 유저가 설정을 해둔 값이 b라는 유저에게도 영향을 끼치고 그 반대도 마찬가지다.  해결방안 각 유저가 로그인을 할때 마다 새로운 FCM token을 생성을 해주는 방법이다. 저장된 token값은 로그아웃 시에 삭제한다. FCM token 사용 과정   1. 로그인 django view.py에서 입력한 user의 값이 db에 있는지 확인을 하고..

카테고리 없음 2025.03.22