Skip to content

Latest commit

Β 

History

History
191 lines (169 loc) Β· 8.34 KB

File metadata and controls

191 lines (169 loc) Β· 8.34 KB

Java Database

μ—¬λŸ¬ DBμ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μžλ°”μ—μ„œλŠ” JDBCλΌλŠ” κ³΅ν†΅λœ μŠ€νŽ™μ„ 제곡

Table of Contents

SQL DDL, DML, DCL?

  • 데이터 μ •μ˜ μ–Έμ–΄ - ( DDL : Data Definition Language ) ν…Œμ΄λΈ”μ΄λ‚˜ κ΄€κ³„μ˜ ꡬ쑰λ₯Ό 생성
    • CREATE - μƒˆλ‘œμš΄ λ°μ΄ν„°λ² μ΄μŠ€ 관계 (ν…Œμ΄λΈ”) View, 인덱슀 , μ €μž₯ ν”„λ‘œμ‹œμ € λ§Œλ“€κΈ°.
    • DROP - 이미 μ‘΄μž¬ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 관계 ( ν…Œμ΄λΈ” ) , λ·° , 인덱슀 , μ €μž₯ ν”„λ‘œμ‹œμ €λ₯Ό μ‚­μ œν•œλ‹€.
    • ALTER - 이미 μ‘΄μž¬ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ κ°œμ²΄μ— λŒ€ν•œ λ³€κ²½ , RENAME의 역할을 ν•œλ‹€.
    • TRUNCATE - 관계 ( ν…Œμ΄λΈ” )μ—μ„œ 데이터λ₯Ό μ œκ±°ν•œλ‹€. ( ν•œλ²ˆ μ‚­μ œμ‹œ λŒμ΄ν‚¬ 수 μ—†μŒ.)
  • 데이터 μ‘°μž‘ μ–Έμ–΄ - ( DML : Data Manipulation Language ) ν…Œμ΄λΈ”μ— 데이터 검색, μ‚½μž…, μˆ˜μ •, μ‚­μ œν•˜λŠ” 데 μ‚¬μš©
    • SELECT - 검색(질의)
    • INSERT - μ‚½μž…(등둝)
    • UPDATE - μ—…λ°μ΄νŠΈ(μˆ˜μ •)
    • DELETE - μ‚­μ œ
  • 데이터 μ œμ–΄ μ–Έμ–΄ - ( DCL : Data Control Language) λ°μ΄ν„°μ˜ μ‚¬μš© κΆŒν•œμ„ κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•˜λ©° GRANT, REVOKE λ¬Έ 등이 μžˆλ‹€.
    • GRANT - νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžμ—κ²Œ νŠΉμ • μž‘μ—…μ— λŒ€ν•œ μˆ˜ν–‰ κΆŒν•œμ„ λΆ€μ—¬ν•œλ‹€.
    • REVOKE - νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžμ—κ²Œ νŠΉμ • μž‘μ—…μ— λŒ€ν•œ μˆ˜ν–‰ κΆŒν•œμ„ λ°•νƒˆ or 회수 ν•œλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžμ—κ²Œ GRANT 및 REVOKE둜 μ„€μ • ν•  수 μžˆλŠ” κΆŒν•œ.
    • SELECT - λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό 검색할 수 μžˆλŠ” κΆŒν•œ
    • INSERT - λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό 등둝(μ‚½μž…)ν•  수 μžˆλŠ” κΆŒν•œ
    • UPDATE - λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό μ—…λ°μ΄νŠΈ ν•  수 μžˆλŠ” κΆŒν•œ
    • DELETE - λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό μ‚­μ œν•  수 μžˆλŠ” κΆŒν•œ.
    • USAGE - μŠ€ν‚€λ§ˆ λ˜λŠ” ν•¨μˆ˜μ™€ 같은 λ°μ΄ν„°λ² μ΄μŠ€ 개체λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” κΆŒν•œ

DELETE, TRUNCATE, DROP의 차이

  • DELETE : λ°μ΄ν„°λŠ” μ§€μ›Œμ§€μ§€λ§Œ ν…Œμ΄λΈ” μš©λŸ‰μ€ 쀄어 λ“€μ§€ μ•ŠλŠ”λ‹€. μ›ν•˜λŠ” λ°μ΄ν„°λ§Œ μ§€μšΈ 수 μžˆλ‹€. 잘λͺ» μ‚­μ œ ν•œ 경우 μ‚­μ œν•œκ²ƒμ„ 되돌릴 수 μžˆλ‹€.
  • TRUNCATE : μ‚­μ œν›„ μš©λŸ‰μ΄ 쀄어듀고 인덱슀 등도 λͺ¨λ‘ μ‚­μ œλœλ‹€. ν…Œμ΄λΈ”μ΄ μ‚­μ œ λ˜μ§€λŠ” μ•ŠμœΌλ‚˜ λ°μ΄ν„°λ§Œ μ‚­μ œν•œλ‹€. μ„ νƒν•΄μ„œ μ§€μšΈ 수 μ—†λ‹€. μ‚­μ œ ν›„ μ ˆλŒ€ 되돌릴 수 μ—†λ‹€
  • DROP : ν…Œμ΄λΈ” 전체λ₯Ό μ‚­μ œ, 곡간, 객체λ₯Ό μ‚­μ œν•œλ‹€, μ‚­μ œ ν›„ μ ˆλŒ€λ‘œ 되돌릴 수 μ—†λ‹€.

ORM

Object와 Relation κ°„μ˜ 뢈일치 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 도ꡬ μ½”λ“œμ˜ λ°˜λ³΅μ„ 쀄이고 객체 μ€‘μ‹¬μ˜ 섀계에 μ§‘μ€‘ν•΄μ„œ κ°œλ°œμ„ μ§„ν–‰ν•  수 μžˆλ‹€.

JPA

μžλ°” μ§„μ˜μ—μ„œ 자주 μ“°μ΄λŠ” ORM은 JPA와 Hibernateκ°€ μžˆλ‹€. JPAλ₯Ό λ§Œλ“€λ‹Ήμ‹œ NOSQL이 λ‚˜μ˜€μ§€ μ•Šμ•„μ„œ RDBMSμ—λ§Œ ν•œμ •μ μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯

JpaRepository Class Diagram

JpaRepository--extends-->PagingAndSortingRepository
PagingAndSortingRepository--extends-->CrudRepository
CrudRepository--extends-->Repository
Class Methods
Repository
CrudRepository save
saveAll
findById
existsById
findAll
findAllById
delete
deleteAll
PagingAndSortingRepository findAll(Sort var1)
findAll(Pageable var1)
JpaRepository flush()
saveAndFlush()
deleteInBatch()
getOne()

λ°μ΄ν„°λ² μ΄μŠ€μ™€ 객체 λ§΅ν•‘

Entity

μžλ°” μ œλ„ˆλ¦­μ—μ„œ Type ν‘œκΈ° μ•½μ–΄μ˜ 의미

  • E - Element (μš”μ†Œλ₯Ό 의미)
  • K - Key (ν‚€λ₯Ό 의미)
  • N - Number (숫자λ₯Ό 의미)
  • T - Type (νƒ€μž…μ„ 의미)
  • V - Value (값을 의미)
N:1

Association κ΄€κ³„λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 객체가 μ—°κ²°λ˜μ–΄ μžˆλŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이떄 연결은 ν•˜λ‚˜μ˜ 객체가 λ‹€λ₯Έ 객체λ₯Ό μ†Œμœ ν•˜κ±°λ‚˜ μ°Έμ‘°ν•˜λŠ” μƒνƒœκ°€ λœλ‹€.

Entity
public class School {
	@id @Column("SCHOOL_ID")
	private Long id;
	private String name;
	private String address;
	private String telnumber;
}

@Entity
public class Student {
	@Id @Column("STUDENT_ID")
	private Long id;
	private String userName;
	private String grade;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinCoulmn(name = "SCHOOL_ID")
	private School school
}

FetchType.LAZY λ‘œλ”©μ„ μ‚¬μš©ν•˜λ©΄ JPAλŠ” ν•œ λ²ˆμ— λͺ¨λ“  데이터λ₯Ό λ‹€ λ‘œλ”©ν•˜μ§€ μ•Šκ³  proxyλ₯Ό μ΄μš©ν•΄μ„œ μ²˜λ¦¬ν•œλ‹€. 두 개 μ΄μƒμ˜ Entity듀을 μ œμ–΄ν•˜λŠ” λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•  λ•ŒλŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ„ SchoolService의 findStudentInfo λ©”μ„œλ“œμ™€ 같이 @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄μ„œ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ‹€ν–‰λ˜λ„λ‘ ν•΄μ•Ό ν•œλ‹€.

1:N
@Entity
public class School {
	@id @GeneratedValue
	@Column("SCHOOL_ID")
	private Long id;
	private String name;
	private String address;
	private String telnumber;
	
	@OneToMany(mappedBy = "school")
	private Set<Student> students;
	
	public void registerStudent(Student s){
		if (students == null) {
			students = new HashMap<Student>();
		}
		students.add(s);
	}
}

@Entity
public class Student {
	@Id @Column("STUDENT_ID")
	private Long id;
	private String userName;
	private String grade;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinCoulmn(name = "SCHOOL_ID")
	private School school
}

QueryDSL

QueryDSL은 μΌμ’…μ˜ ν‘œν˜„μ‹μœΌλ‘œ κΈ°μ‘΄ μ–Έμ–΄μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ— 질의λ₯Ό ν•  수 μžˆλ‹€. maven, gradle μ„€μ •μœΌλ‘œ QClass λ₯Ό Entityλ‘œλΆ€ν„° μžλ™μœΌλ‘œ 생성해쀀닀.

Spring Data JPA μ—μ„œλŠ” queryDSL을 같이 μ‚¬μš©ν•  수 μžˆλŠ” 기반 클래슀λ₯Ό 제곡 ν•˜λŠ”λ° κ·Έ ν΄λž˜μŠ€κ°€ QueryDslRepositorySupport 이닀. JPA μ‚¬μš©ν• λ–„μ˜ κΈ°μ‘΄ Repository에 κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” ν˜•νƒœλ‘œ 개발 진행이 κ°€λŠ₯ν•˜λ‹€. QueryDslRepositorySupportλŠ” 좔상 ν΄λž˜μŠ€μ΄λ―€λ‘œ κ΅¬ν˜„μ²΄λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ° μ ˆμ°¨κ°€ ν•„μš”ν•˜λ‹€.

  1. QClass 생성 (Build Tool μ„€μ •)
  2. Custom Repository Interface 생성 (JPAμ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ” 쿼리에 λŒ€ν•œ Interface 생성)
  3. QueryDslRepositorySupport κ΅¬ν˜„μ²΄ μž‘μ„±
  4. Custom Repository 생성
public interface UserRepositoryCustom {
	List findAllLike(String keyword);
}

public class UserRepositoryImpl extends QuerydslRepositorySupport implements UserRepositoryCustom {
    public UserRepositoryImpl() {
        super(UserEntity.class);
    }
    @Override
    @Autowired
    public void setEntityManager(EntityManager entityManager) {
        super.setEntityManager(entityManager);
    }
    @Override
    public List findAllLike(String keyword) {
        QUserEntity qUserEntity = QUserEntity.userEntity;
        JPQLQuery<UserEntity> query = from(qUserEntity);
        List<UserEntity> resultList = 
		        query.where(qUserEntity.username.like(keyword)).fetch();
        return resultList;
    }
}

QueryDslRepositorySupportλŠ” Entity Class에 λŒ€ν•œ μ˜μ‘΄μ„±μ΄ κ°•ν•΄μ„œ μƒμ„±μ‹œμ— 전달받지 λͺ»ν•˜λ©΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ–΄λ„ μ‚¬μš©ν•  수 μ—†μœΌλ©° λ‹€λ₯Έλ°©λ²•μœΌλ‘œ Entityλ₯Ό μ£Όμž… ν•  수 μ—†κ²Œ λ˜μ–΄μžˆλ‹€. (setEntity μ—†μŒ)

MyBatis

MyBatisμ—μ„œλŠ” 쿼리 λ§€ν•‘ ꡬ문을 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ sqlSession 객체λ₯Ό μ‚¬μš©ν•˜κ³  sqlSession 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œ SqlSessionFactoryλ₯Ό μ‚¬μš©ν•œλ‹€. μŠ€ν”„λ§κ³Ό 같이 μ‚¬μš©ν•  λ•ŒλŠ” SqlSessionTemplate을 μ“΄λ‹€. κ·Έ μ΄μœ λŠ” μŠ€ν”„λ§ μ‚¬μš©μ‹œμ— sqlSession을 λŒ€μ²΄ν•˜μ—¬μ£Όκ³  μ˜ˆμ™Έ 처리λ₯Ό Mybatisκ°€ μ•„λ‹ˆλΌ Spring의 DataAccessException으둜 μΉ˜ν™˜ μ‹œμΌœμ€€λ‹€.

Mybatisμ—μ„œλŠ” Root Resource 폴더에 DDL, DML νŒŒμΌμ„ 두고 μ‹€ν–‰λ˜κ²Œ ν•  수 μžˆλ‹€. application.properties νŒŒμΌμ— μ§€μ • κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ 5κ°€μ§€μ΄λŒœ

  • Spring.database.platform : 데이터 베이슀 μœ ν˜•
  • Spring.datasource.schema : μŠ€ν‚€λ§ˆλ₯Ό μ •μ˜ν•˜λŠ” SQL파일
  • Spring.datasource.data : 데이터λ₯Ό μž…λ ₯ν•˜λŠ” SQL 파일
  • Spring.datasource.separator : SQL κ΅¬λΆ„μž
  • Spring.datasource.sql-script-encoding : SQL 인코딩 μ˜΅μ…˜

Connection pool

Tomcat 7 λ²„μ „κΉŒμ§€λŠ” DBCP1 - μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ μ„œλ²„μ— λΆ€ν•˜κ°€ 많이 λͺ°λ¦΄ κ²½μš°μ— λŒ€κΈ°μ—΄μ΄ μƒκΈ°λŠ” λ¬Έμ œκ°€ 많음