[Java] 35. 스레드 제어와 생명 주기(1)
·
Java/멀티스레드&동시성
스레드 제어와 생명 주기(1)#Java/멀티스레드정리스레드 기본 정보Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다. Thread 클래스가 제공하는 정보들을 직접 확인할 수 있다.0. 스레드 조회Thread mainThread = Thread.currentThread();현재 실행중인 스레드 객체를 가져온다.1. 스레드 생성스레드를 생성할 때는 실행할 Runnable 인터페이스의 구현체와, 스레드의 이름을 전달할 수 있다.Thread myThread = new Thread(new HelloRunnable(), "myThread");Runnable 인터페이스: 실행할 작업을 포함하는 인터페이스이다. HelloRunnable 클래스는 Runnable 인터페이스를 구현한 클래스이다.스레드 이..
[Java] 34. 스레드 생성과 실행
·
Java/멀티스레드&동시성
스레드 생성과 실행#Java/멀티스레드정리자바 메모리 구조 복습자바 메모리 구조스택 영역은 더 정확히는 각 스레드별로 하나의 실행 스택이 생성된다. 따라서 스레드 수 만큼 스택이 생성된다. 지금은 스레드를 1개만 사용하므로 스택도 하나이다. 이후 스레드를 추가할 것인데, 그러면 스택도 스레드 수 만큼 증가한다.스레드 생성자바에서 스레드는 어떻게 생성할까?스레드를 만들 때는 Thread 클래스를 상속 받는 방법과 Runnable 인터페이스를 구현하는 방법이 있다.스레드 생성 - Thread 상속자바가 예외를 객체로 다루듯이, 스레드도 객체로 다룬다. 스레드가 필요하면, 스레드 객체를 생성해서 사용하면 된다.package thread.start;public class HelloThread extends Th..
[Java] 33. 프로세스와 스레드
·
Java/멀티스레드&동시성
프로세스와 스레드#Java/멀티스레드멀티태스킹의 등장프로그램의 실행이란 프로그램을 구성하는 코드를 순서대로 CPU에서 연산(실행)하는 일이다.여기서 CPU 코어는 하나로 가정하므로, 한 번에 하나의 프로그램 코드만 실행할 수 있다.과거에는 한 번에 하나의 프로그램만 실행하여, 프로그램 하나가 끝난 뒤에 다른 프로그램을 실행할 수 있었다.이는 사용자에게 매우 큰 불편함을 초래한다.이를 해결하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 '멀티태스킹' 기술이 등장했다.멀티태스킹만약 CPU가 매우 빠르게 두 프로그램의 코드를 번갈아 수행한다면, 사람이 느낄 때 두 프로그램이 동시에 실행되는 것처럼 느껴질 것이다. (대략 0.01초(10ms) 단위로 돌아가며 실행한다.)예를 들면, CPU 코어가..
[JPA] JPQL(객체지향 쿼리 언어) 정리
·
DB Access/JPA
객체지향 쿼리 언어#JPA/기본/JPA가 지원하는 다양한 쿼리 방법JPQL (아래에서 자세히 다룸)JPA Criteria/Criteria 소개: 문자열 기반 jpql의 한계를 극복하기 위해 등장.너무 복잡하고 실용성이 없음.QueryDSL/QueryDSL 소개: JPQL 빌더 역할자바 코드로 JPQL 작성할 수 있음.컴파일 시점 문법 오류 찾을 수 있고, 동적 쿼리 작성이 편리함.단순, 쉬움, 실무 사용 권장.네이티브 SQL/네이티브 SQL 소개em.createNativeQuery(sql, Member.class)SQL을 직접 사용. JPQL로 해결할 수 없는 특정 DB에 의존적인 기능을 위해 사용JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용/JDBC 직접 사용..
[JPA] 값 타입
·
DB Access/JPA
값 타입#JPA/기본/기본값 타입JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체식별자로 추적 가능회원 값이 바껴도 PK로 추적 가능값 타입: 식별자 X 추적 불가회원의 주소 추적 불가. 단순히 값 처럼 취급됨/값 타입 분류/기본값 타입(int, double, Integer, Long, String, …)엔티티에 생명주기 의존(회원 삭제시 이름, 나이,… 삭제)공유하면 안됨. (동명이인 회원 A,B: 회원 A 이름 바꿨는데 회원 B 이름도 바뀌면 안됨)ex) 래퍼 클래스, primitive type/임베디드 타입(복합 값 타입)새로운 값 타입을 직접 정의할 수 있음.ex) x, y 좌표를 담는 Position 클래스ex) {근무 시작일, 근무 종료일}, {주소 도시, 주소 번지..
[JPA] 프록시와 연관관계 관리
·
DB Access/JPA
프록시와 연관관계 관리#JPA/기본/프록시:엔티티 조회시 연관된 엔티티까지 조회해야 할까?/프록시 기초em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회/프록시 특징실제 클래스와 겉모양이 같다. 사용자는 구분하지 않고 사용하면 됨.프록시 객체는 원본 엔티티를 상속받음타입 체크 시== 대신 instanceof 사용프록시 객체는 실제 객체의 참조(target)를 보관하고, 실제 객체의 메서드를 호출한다(위임)프록시 객체는 처음 사용할 때 한 번만 초기화.프록시를 통해 실제 객체의 필드를 처음 조회시 실제 엔티티를 조회한다. (즉, 필드를 처음 조회시 쿼리 나감)영속성 컨텍스트에 엔티티가 이미 있으면 em...
[JPA] 고급 매핑 - 상속 관계 매핑
·
DB Access/JPA
고급 매핑 - 상속 관계 매핑#JPA/기본/상속관계 매핑: DB에는 상속관계가 없다.객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑각각 테이블로 변환 → 조인 전략통합 테이블로 변환 → 단일 테이블 전략서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략객체 입장에서는 셋 다 똑같음. 다 매핑이 가능함./주요 어노테이션@Inheritance(strategy=InheritanceType.XXX)@DiscriminatorColumn(name="DTYPE")@DiscriminatorValue("XXX")/조인 전략@DiscriminatorColumn 추가 시 DTYPE 칼럼 생김.DTYPE을 안넣어도 되는데, 넣어주는게 좋다.@DiscriminatorValue("A")로 하위 테이블 이름 지정 가능..
[JPA] 다양한 연관관계 매핑
·
DB Access/JPA
다양한 연관관계 매핑#JPA/기본/연관관계 매핑시 고려사항 3 가지/다중성 (N:M)/단방향, 양방향: 테이블과 객체의 차이 고려!/연관관계의 주인은 어디에?/다대일 [N:1]/다대일 단방향/다대일 양방향연관관계 주인: FK 기준/일대다 [1:N]/일대다 단방향: 객체에서 연관관계 주인은 1쪽이지만, DB에서 FK는 다쪽에 있다.객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조FK 위치와 연관관계 주인 위치가 달라서 @JoinColumn을 꼭 사용해야 함. 안쓰면 조인 테이블 생김FK 위치와 연관관계 주인 위치가 달라서 일쪽에서 저장 시 FK 매핑을 위한 쿼리가 추가적으로 나감 권장 X다쪽에..
[JPA] 연관관계 매핑 기초
·
DB Access/JPA
연관관계 매핑 기초#JPA/기본/연관관계가 필요한 이유객체지향 설계의 목표는 자율적인 객체들의 협력 공동체 를 만드는 것이다/객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다./단방향 연관관계/객체 지향 모델링@Entitypublic class Member {@Id @GeneratedValueprivate Long id;@Column(name = "USERNAME")private String name;private int age;// @Column(name = "TEAM_ID")// private Long teamId;@ManyToOne@JoinColumn(name = "TEAM_ID")private Team team;...(연관관계 저장)//팀 저장Team team = ne..
[Spring] @MockitoBean 등장(Spring 6.2), Deprecated되는 @MockBean(Spring Boot 3.4.0)
·
Spring
@MockBean은 스프링부트 3.4.0부터 Deprecated(코드가 어두워 보이지 않는다면, 우측 하단의 다크모드 버튼을 통해 다크모드를 해제하시면 됩니다!)기존 테스트 코드들은, 테스트 코드가 스프링 컨테이너의 의존도가 높았다.이를 개선하고자 Spring Framework 6.2부터 Bean-Override 기능을 테스트 코드에서 활성화한다고 한다.(물론, Bean-Override 기능은, 프로덕션 코드에서는 지양해야 하고, 어차피 프로덕션에서는 Deprecated 될 기능이다. 즉, Bean-Override 기능이 프로덕션 컨텍스트에서는 없어지고 테스트 컨텍스트에서만 유지되도록 모델이 변경되는 것이다) 기본적이 원리는 Bean-Override를 통해, Bean을 테스트용 Bean으로 교체하는 것이..