전체 글 77

[JAVA] Garbage Collector (가비지 컬렉터) 기본 개념

기본 배경 지식 - Object는 heap 영역에 할당 (static, class 정의 등의 메타 데이터들은 method area에 할당) - Garbage Collection은 Garbage Collector라는 데몬 쓰레드에 의해서 수행된다 - GC를 강제로 실행시킬 수는 없다 - heap이 꽉 차서 새로운 할당을 하지 못할 경우 OutOfMemory가 발생한다 🙋‍♀️ 데몬 쓰레드 - 사용자가 직접 조작하지 않고, 백 그라운드에서 작업하는 스레드 - 일반 스레드가 모두 종료되면, 데몬 스레드는 강제 종료된다 Garbage Collection - 자바 언어에서 제공하는 자동 메모리 관리자 - 더 이상 사용하지 않는 객체들의 메모리 할당을 해제하는 역할을 한다 - 객체의 나이에 따라 힙을 두 가지 ge..

카테고리 없음 2022.03.05

트랜잭션 격리 수준

종류는 잘 알려진대로 아래 4가지. 1. READ UNCOMMITTED SELECT 조회 시, 공유락 X 커밋되지 않은 데이터를 읽을 수 있다 🚨 Dirty Read : 커밋되지 않은 (변경 중인) 데이터를 읽어, 데이터의 무결성이 깨질 수도 있는 현상 A 트랜잭션이 B 트랜잭션이 건드리고 있는 데이터를 읽고 이를 바탕으로 로직을 수행하고 A 트랜잭션은 커밋함 B 트랜잭션이 갑자기 롤백되버림 A 트랜잭션 당황.. 난 이미 커밋해버렸는데..? (무결성 와장창) 2. READ COMMITTED SELECT 조회 시, 데이터에 공유락 O 커밋된 데이터만 읽을 수 있다 해당 데이터가 사용되고 있을 때만 공유락이 걸린다 SELECT 대상이 되는 데이터 row1, row2가 있을 때 row1을 읽는 순간에는 row..

DB 2021.11.30

스프링 핵심 원리 기본편 - 스프링 핵심원리 이해 2 객체 지향 원리 적용

사실 객체 지향 5대 원칙들이 다 비슷비슷하고 연관성이 깊어서 정확히 어떤 상황에 어떤 원칙에 위배되는지 혹은 지켜지고 있는지 판단하기가 애매했는데 아주 쉽게 예시를 들어서 잘 설명해주셨다 처음 코드는 아래와 같았다 public class OrderServiceImpl implements OrderService { private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); 구체 클래스와 인터페이스를 적절히 사용해서 역할과 구현을 충분히 나눴다. 💥 DIP 원칙 위배 하지만 OrderServiceImpl에서는 인터페이스 뿐만 아니라 구체클래스인 FixDiscountPolicy()에 의존하고 있다. 클래스 다이어그램을 만들어보면 아래와 같다..

카테고리 없음 2021.05.01

[Spring] Heroku로 간단 배포하기

앱 만들기 먼저 heroku 홈페이지에 접속한 뒤 새로운 앱을 만들어 준다. (계정이 없다면 가입부터) Option 1. Heroku git으로 배포하기 1. Heroku CLI을 설치 ✔ 설치할 때 'PATH not updated' 에러가 떠서, 따로 환경변수 설정을 해주었다. [ 참고 ] 2. 리모트 저장소 생성 배포하고싶은 파일의 root 위치로 이동한다. 나는 demo 프로젝트를 jihye-elmo라는 이름으로 배포할 예정이다. (만약 프로젝트가 깃등록이 되어있지 않다면 git init 명령어를 실행) 아래 명령어를 통해 리모트 저장소를 생성한다. // jihye-elmo라는 이름의 리모트 저장소 생성 heroku git:remote -a jihye-elmo // 리모트 브랜치가 정상적으로 생성되..

카테고리 없음 2021.03.03

스프링 핵심 원리 기본편 정리 - 1. 객체 지향 설계와 스프링

인프런 스프링 핵심 원리 기본편을 참고. 객체 지향 프로그래밍 각 객체들은 메시지를 주고받고 데이터를 처리할 수 있다. 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 다형성 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다. 예를 들어서 클라이언트가 새에게 fly()라는 메시지를 보내면, 새 객체가 참새든 비둘기든간에 나는 역할을 수행할 것이다. 이렇게되면 나중에 까마귀라는 객체를 새로 추가하더라도 새 객체 하위에 있기 때문에 fly()라는 역할을 그대로 수행할 수 있다. 이처럼 다형성을 활용하면 역할과 구현을 분리해서 로직을 단순하게, 유연하게 작성할 수 있다. 그만큼 유지보수도 편리해진다. 좀 더 일반화해서 생각해보면 클라이..

카테고리 없음 2021.03.02

[Java] 배열, 람다의 기초

배열 변수의 크기 * 갯수만큼 연속적으로 공간을 할당받고, 특정 element에 접근할 때, 주소값 + index로 접근이 가능하다. 생성 시에 크기가 정해지는 특성 때문에 동적으로 크기를 바꿀 수 없다. index는 왜 0부터 시작할까 1부터 시작하면 맨 첫 0 번째 메모리 공간을 낭비하게 된다. 0부터 시작해야 마지막 수가 N이 되어서 깔끔하다 선언 위치에 따라 달라지는 메모리 할당 위치 main() 메소드 안 : 배열 a가 스택에 생성 main() 메소드 밖 : 배열 a가 코드 영역에 생성 C에서의 주소연산, 배열과 포인터 *(a + 2) == a[2] 같은 의미다. 즉, 배열에서 인덱스로 접근을 하는 방식은 포인터가 가리키는 곳의 주소 연산을 하는 것과 동일한 방식으로 이루어진다. 이렇게 공간 복..

카테고리 없음 2021.03.01

[Java] 자바 쓰레드와 동기화

프로세스 실행 중인 프로그램(program) 프로그램 실행 → OS에서 프로그램 코드를 메모리에 적재(할당) → 프로세스 생성 쓰레드 thread is a abstraction of execution in a program 프로그램 카운터와 실행 컨텍스트 일부를 추상화 실행 흐름에 대한 추상화 메소드(함수)가 최소단위 자바 실행 시 메인쓰레드 이외의 쓰레드도 동작한다! 즉, 이미 멀티 쓰레드로 작동하고 있다. 싱글 쓰레드로 작동하는 것 처럼 보일 뿐. 메인 쓰레드 생성 이후 JVM 작동을 위해서 자동으로 GC 등의 작업을 담당하는 스레드가 생성된다. 때문에 메인 쓰레드의 스레드 넘버가 1이라고 가정했을 때, 메인 안에서 처음으로 new Thread()로 새로운 유저 쓰레드를 생성한 유저 쓰레드의 스레드 ..

카테고리 없음 2021.03.01

JVM 공부한 내용 정리

Java 제임스 고슬링 + 빌 조이 한 번 쓰고 모든 곳에서 실행하겠다라는 철학 인터넷 시대에 접어들면서 Java가 성공 가도를 달렸다. 왜? 자바 애플릿 때문! 자바 애플릿은 어떤 컴퓨터의 어떤 브라우저에서도 똑같은 코드를 실행할 수 있게 자바 바이트 코드 형태로 배포되는 애플릿을 말한다. (⁕ 애플릿 : Application + -let(작은) = 작은 어플리케이션) 자바를 컴파일한 코드를 클래스 파일이라고 한다. 그 클래스 파일 안에는 자바 바이트 코드가 들어있다. 그리고 이 자바 바이트 코드는 JVM이 실행할 수 있다. JRE ( Java Runtime Environment ) 자바 프로그램 실행에 필요한 요소들이 들어있다. JVM, 필수 라이브러리(rt.jar), JIT 컴파일러 등으로 구성되어..

카테고리 없음 2021.02.17

Git 기본 명령어 및 개념 정리

⁕ 아직 채워야할 내용들이 많다. git add git commit git commit -a // add 명령 생략하고 자동 스테이징 + 커밋 git push git pull // fetch + merge git fetch {원격저장소} {브랜치} // 원격 저장소와 브랜치 생략 시 모든 원격 저장소에서 모든 브랜치를 가지고 온다. add - 파일들을(변경사항 아님)을 스테이지에 추가 commit - 스테이지에 있는 내용을 커밋한다 push - 커밋 내용을 원격저장소로 옮기기 pull - 원격저장소의 내용을 가져오고 working디렉토리의 내용과 다르면 merge 한다 (Patch +_ merge) fetch - 원격 저장소의 브랜치와 커밋들을 로컬 저장소와 동기화 git checkout git chec..

카테고리 없음 2021.02.16