일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 지연로딩
- SQL프로그래밍
- PS
- 동적sql
- 다대일
- eager
- 이진탐색
- 스프링 폼
- 다대다
- 힙
- 백트래킹
- BOJ
- FetchType
- JPQL
- 연관관계
- exclusive lock
- 일대다
- 비관적락
- 스토어드 프로시저
- querydsl
- fetch
- 즉시로딩
- 낙관적락
- execute
- 유니크제약조건
- 연결리스트
- shared lock
- CHECK OPTION
- dfs
- 데코레이터
- Today
- Total
목록전체 글 (555)
흰 스타렉스에서 내가 내리지
# 고아 객체 JPA 는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데, 이것을 고아 객체 제거라 한다. @OneToMany(mappedBy = "parent", orphanRemoval = true) private List children = new ArrayList(); 이제 컬렉션에서 제거한 엔티티는 자동으로 삭제된다. parent.getChildren().remove(0);// 자식 엔티티를 컬렉션에서 제거 DELETE FROM CHILD WHERE ID = ? orphanRemoval = true 옵션으로 인해 컬렉션에서 엔티티를 제거하면 데이터베이스의 데이터도 삭제된다. * 정리 고아 객체 제거는 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로..
# 내부 조인 두 테이블에 모두 있는 내용만 조인되는 방식이다. 만약, 양쪽 중에 한 곳이라도 내용이 있을 때 조인하려면 외부 조인을 사용해야 한다. SELECT * FROM member m INNER JOIN article a ON m.id = a.mem_id WHERE a.title='~~' INNER JOIN 에서 INNER 를 생략하고 JOIN 만 써도 INNER JOIN 으로 인식한다. # 외부 조인 한 쪽에만 데이터가 있어도 결과가 나온다. SELECT FROM OUTER JOIN ON [WHERE 검색 조건]; LEFT OUTER JOIN 왼쪽 테이블의 내용이 모두 출력된다. LEFT JOIN 이라고 써도 된다. RIGHT OUTER JOIN 오른쪾 테이블의 내용이 모두 출력된다. FULL ..

# 함수를 이용한 명시적인 변환 (explicit conversion) 데이터 형식을 변환하는 함수는 CAST(), CONVERT() 이다. CAST ( 값 AS 데이터_형식 [ (길이) ] ) --- CONVERT ( 값, 데이터_형식 [ (길이) ] ) CAST() 나 CONVERT() 함수 안에 올 수 있는 데이터 형식은 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등이다. SIGNED 는 부호가 있는 정수, UNSIGNED 는 부호가 없는 정수이다. * 예제 SELECT AVG(price) AS '평균 가격' FROM buy; 가격을 실수보다는 정수로 보고 싶을 때, 데이터 형 변환을 사용한다. SELECT CAST(AVG(price) AS SIGNED) '평균..

# SQL 에서의 변수 SQL 도 다른 일반적인 프로그래밍 언어처럼 변수를 선언하고 사용할 수 있다. 변수는 MySQL 워크벤치를 재시작할 때까지는 유지되만, 종료하면 없어진다. SET @txt = '도시 이름 : '; SET @population = 8000000; SELECT @txt, Name, Population FROM city WHERE Population >= @population; # LIMIT 에는 사용할 수 없다 이 SQL 은 SELECT 문에서 오류가 발생한다. LIMIT 에는 변수를 사용할 수 없기 때문이다. # LIMIT 에 변수를 사용할 수 있게 하는 편법 → PREPARE 와 EXECUTE SET @txt = '도시 이름 : '; SET @population = 8000000;..
만약 몇억 거느이 데이터가 있는 대용량의 테이블이 더 이상 필요 없다면 어떻게 삭제하는 것이 좋을까? 1. DELETE - 삭제가 오래 걸린다. 2. DROP - 테이블 자체가 삭제된다. - 따라서 순식간에 모두 삭제된다. 3. TRUNCATE - DELETE 와 동일한 효과를 내지만 속도가 매우 빠르다. DROP 은 테이블이 아예 없어지지만, DELETE 와 TRUNCATE 는 빈 테이블을 남긴다. TRUNCATE 는 DELETE 와 달리 WHERE 문을 사용할 수 없다. 그러므로 TRUNCATE 는 조건 없이 전체 행을 삭제할 때만 사용된다. # 결론 대용량 테이블의 전체 내용을 삭제할 때 테이블 자체가 필요 없을 경우에는 DROP 으로 삭제하고, 테이블의 구조는 남겨놓고 싶다면 TRUNCATE 로 ..

예제 테이블로, MySQL 에서 제공하는 world 데이터베이스를 이용한다. CREATE TABLE city_popul (city_name CHAR(35), population INT); INSERT INTO city_popul SELECT Name, Population FROM world.city; 주의할 점은 SELECT 문의 열의 개수가 INSERT 할 테이블의 열 개수와 같아야 한다는 점이다. DESC 명령으로 테이블 구조를 확인하여 새로운 테이블을 만든다

# 자동으로 증가하는 AUTO_INCREMENT AUTO_INCREMENT 는 열을 정의할 때 1부터 증가하는 값을 입력해준다. 단, AUTO_INCREMENT 로 지정하는 열은 꼭 PRIMARY KEY 로 지정해줘야 한다. CREATE TABLE member ( member_id INT AUTO_INCREMENT PRIMARY KEY ); # AUTO_INCREMENT 로 입력되는 다음 값을 100 부터 시작하게 하기 ALTER TABLE MEMBER AUTO_INCREMENT=100; INSERT INTO member VALUES (NULL); SELECT * FROM member; # AUTO_INCREMENT 로 입력되는 다음 값을 1003, 1006, 1009, ... 로 3씩 증가하도록 설정하..

# 프록시 # 1 Member member = memberRepository.findById(1L).or(...); System.out.println(member.getTeam()); # 2 Member member = memberRepository.findById(1L).or(...); System.out.println(member.getUsername()); # 1 에서는, 회원은 물론이고, 회원과 연관된 팀의 이름도 출력한다. # 2 에서는, 회원 엔티티만 사용하고 팀 엔티티는 전혀 사용하지 않는다. # 2에서 회원 엔티티만 사용하므로, 그와 연관된 팀 엔티티까지 DB 에서 함께 조회해 두는 것은 비효율적이다. JPA 는 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데, 이것을 지..

일대일 식별 관계는 자식 테이블의 기본 키 값으로 부모 테이블의 기본 키 값만 사용한다. @Entity public class Board { @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "BOARD_ID") private Long id; @OneToOne(mappedBy = "board") private BoardDetail boardDetail; } @Entity public class BoardDetail { @Id private Long boardId; @MapsId @OneToOne @JoinColumn(name = "BOARD_ID") private Board board; } BoardDetail 처럼 식별자가 단순히 컬럼 하나면 @Maps..
JPA 에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다. JPA 는 영속성 컨텍스트에 엔티티를 보관할 때, 엔티티의 식별자를 키로 사용한다. 그리고 식별자를 구분하기 위해 equals 와 hashCode 를 사용해서 동등성 비교를 한다. 그런데 식별자 필드가 하나일 떄는 보통 자바의 기본 타입을 사용하므로 문제가 없지만, 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals 와 hashCode 를 구현해야 한다. JPA 는 복합키를 지원하기 위해 @IdClass 와 @EmbeddedId 2가지 방법을 제공한다. @IdClass 는 관계형 데이터베이스에 가까운 방법이고, @EmbeddedId 는 좀 더 객체지향에 가까운 방법이다. # @IdClass 복합 키..