본문 바로가기

분류 전체보기117

JVM의 Stack&Heap 이해하기 JVM은 OS의 메모리 영역에 접근을 해서 Java의 메모리를 관리하는 가상 프로그램을 의미한다. 이 메모리를 그냥 사용해서는 안되고 누군가 쓸 때 할당을 해주고 또 다쓰고 나면 해제를 해줘야 한다. 메모리 관리를 C나 C++을 개발할 때는 사용자가 직접 관리를 해줘야 했지만 자바에서는 GC가 직접 해준다. 이러한 JVM의 Stack과 Heap 영역에 대해서 자세히 살펴보자. JVM Java의 Stack과 Heap에 대해서 이해하기 위해서는 먼저 JVM에 대한 이해가 필요하다. 간단하게 자바에서 메모리 관리가 어떻게 이루어지는지 살펴보자. JVM 이전 C/C++ 문제점 위 그림처럼 리눅스에서 컴파일해서 나온 실행파일을 윈도우에서 돌리게 되면 안돌아간다. C/C++는 컴파일 플랫폼과 타겟 플랫폼(= 운영체.. 2023. 7. 8.
빈 생명주기(라이프사이클)와 빈 스코프 빈 생명주기 스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다. 객체 생성 -> 의존관계 주입 스프링 빈 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다. 스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 이에 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백.. 2023. 7. 3.
스프링 빈(BeanFactory, ApplicationContext, ComponentScan, 의존관계 주입 방법 등) BeanFactory와 ApplicationContext BeanFactory 스프링 컨테이너의 최상위 인터페이스다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. getBean()을 제공한다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 차이는 무엇일까? 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다. 따라서 ApplicationContext는 빈 관리 기능 + 편리한 부가 기능을 제공한다고 생각하면 된다. BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다. BeanF.. 2023. 7. 2.
좋은 객체 지향 설계의 5가지 원칙(SOLID) SOLID 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리 SRP: 단일 책임 원칙(Single Responsibility Priciple) OCP: 개방-폐쇄 원칙(Open/closed Priciple) LSP: 리스코프 치환 원칙(Liskov Substitution Priciple) ISP: 인터페이스 분리 원칙(Interface Segregation Priciple) DIP: 의존관계 역전 원칙(Dependency Inversion Priciple) SRP(Single Responsibility Priciple) - 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 .. 2023. 6. 22.
뷰(View) 뷰(View) 테이블은 실제로 데이터를 갖고 있지만, 뷰는 실제 데이터를 갖지 않는다. 뷰 정의(View Definition, SQL 텍스트 파일)만 갖고 있다. 쿼리에서 뷰가 사용되면 DBMS 내부적으로 질의를 재작성(Rewrite)한다. 실제 데이터를 가지고 있지 않지만 테이블의 역할을 수행한다. 가상 테이블(Virtual Table)이라고도 한다. VIEW 생성 CREATE VIEW v_palyer_team AS SELECT p.player_name, p.back_no, p.team_id, t.team_name FROM player p INNER JOIN team t ON p.team_id = t.team_id; CREATE VIEW 문을 통해 VIEW 생성를 생성할 수 있다. VIEW 확인 SEL.. 2023. 5. 23.
!= NULL, <> NULL, IS NOT NULL 차이 !=, , IS NOT 차이 의미상으로는 같지 않다를 나타내어 모두 동일한 결과를 반환할 것이라고 생각할 수 있다. 하지만,, !=, , IS NOT에는 타입 비교 대상의 범위 차이가 있다. != 와 연산자는 동일한 기능을 하며 원시 타입(Primitive Type)에 대해서만 동작하고, IS NOT NULL은 모든 타입에 대해 동작한다. !=, , IS NOT NULL 예시 != NULL을 사용한 경우 SELECT delv_msg FROM table WHERE delv_msg != NULL; != NULL을 사용한 경우에는 출력한 레코드가 없는 것을 확인할 수 있다. 와는 동일한 기능을 하기 때문에 는 넘어가겠다. IS NOT NULL을 사용한 경우 SELECT delv_msg FROM table WH.. 2023. 5. 19.
TCL(Transaction Control Language) TCL 이란? DCL(Data Control Language)에서 트랜잭션을 제어하는 명령인 COMMIT과 ROLLBACK만을 따로 분리해서 TCL이라고 한다. 트랜잭션 데이터베이스의 논리적 연산 단위 의미적으로 분할할 수 없는 최소의 단위 일반적으로 하나의 트랜잭션은 여러 SQL 문장을 포함한다. 성공 시 모든 연산을 반영, 취소 시 모든 연산을 취소한다 => All or Nothing 트랜잭션 상황 예시 도서 주문 재고 수량 감소, 주문 내역 생성 결제 포인트 적립 교통카드 충전 잔액 증가 결제 계좌 이체 원 계좌의 잔액 감소 주문 내역 생성 결제 포인트 적립 이체라는 하나의 행위를 실행하기 위해서는 한 쪽에서 잔액을 감소하고, 다른 한쪽에서 잔액을 증가시키는 두 연산이 필요하다. 트랜잭션의 특성 (.. 2023. 5. 19.
TDD, 클린 코드 - 사다리 미션 3단계 - 사다리 GitHub - oneny/java-ladder: 사다리 타기 구현을 위한 저장소 사다리 타기 구현을 위한 저장소. Contribute to oneny/java-ladder development by creating an account on GitHub. github.com 기능 정리 User 5글자 이하인 name을 가진다. Users , 를 구분자로 사람 이름을 구분한다. 유저수를 반환한다. 유저목록을 반환한다. 위치에 해당하는 유저를 반환한다. 유저의 위치를 변경한다. Position 다음 포지션으로 이동 시 현재 포지션에서 +1을 한다. 이전 포지션으로 이동 시 현재 포지션에서 -1을 한다. 현재 포지션을 반환한다. Direction 첫 포인트에 대한 left는 false인.. 2023. 5. 18.
쿼리 실행 순서 쿼리 실행 순서 SQL 쿼리문을 실행하는데 순서가 존재한다. FROM (+ JOIN) 쿼리의 첫 번째 실행 순서는 FROM절이다. FROM 절에서는 조회하는 테이블 전체를 가져온다. WHERE 절 WHERE 절에서는 FROM 절에서 읽어온 테이블에서 조건에 맞는 결과만 갖도록 데이터를 필터링한다. GROUP BY 절 GROUP BY 절에서는 선택한 컬럼으로 그룹핑한다. GROUP BY 절을 사용하게 되면 해당 컬럼으로 집계함수를 사용할 수 있다. HAVING 절 HAVING 절은 여러 조건들을 처리한 후 남은 데이터에서 어떤 열을 출력해줄지 선택한다. HAVING 절은 각 그룹에 조건을 걸기 때문에 퍼포먼스가 떨어지게 된다. WHERE 절에 있는 내용을 HAVING 절에서 사용할 수 있다.(단, GROU.. 2023. 5. 18.