day84 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 9μ›” 6일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
84/129

μŠ€ν”„λ§ DB 2편 - 데이터 μ ‘κ·Ό ν™œμš© 기술 μ„Ήμ…˜ 6 μˆ˜κ°•

μ„Ήμ…˜ 6. 데이터 μ ‘κ·Ό 기술 - μŠ€ν”„λ§ 데이터 JPA μˆ˜κ°• μ™„λ£Œ!!

μŠ€ν”„λ§ 데이터 JPA μ£Όμš” κΈ°λŠ₯
μŠ€ν”„λ§ 데이터 JPAλŠ” JPAλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‹€. κ°€μž₯ λŒ€ν‘œμ μΈ κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™λ‹€.

  • 곡톡 μΈν„°νŽ˜μ΄μŠ€ κΈ°λŠ₯
  • 쿼리 λ©”μ„œλ“œ κΈ°λŠ₯

곡톡 μΈν„°νŽ˜μ΄μŠ€ κΈ°λŠ₯

JpaRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 기본적인 CRUD κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
곡톡화 κ°€λŠ₯ν•œ κΈ°λŠ₯이 거의 λͺ¨λ‘ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

JpaRepository μ‚¬μš©λ²•

public interface ItemRepository extends
JpaRepository<Member, Long> {}

JpaRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 λ°›κ³ , μ œλ„€λ¦­μ— 관리할 <μ—”ν‹°ν‹°, μ—”ν‹°ν‹°ID>λ₯Ό μ£Όλ©΄ λœλ‹€. 그러면 JpaRepositoryκ°€ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ CRUD κΈ°λŠ₯을 λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‹€.

μŠ€ν”„λ§ 데이터 JPAκ°€ κ΅¬ν˜„ 클래슀λ₯Ό λŒ€μ‹  생성

μŠ€ν”„λ§ 데이터 JPAκ°€ κ΅¬ν˜„ 클래슀λ₯Ό λŒ€μ‹  생성

JpaRepository μΈν„°νŽ˜μ΄μŠ€λ§Œ 상속 λ°›μœΌλ©΄ μŠ€ν”„λ§ 데이터 JPAκ°€ ν”„λ‘μ‹œ κΈ°μˆ μ„ μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„ 클래슀λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€. 그리고 λ§Œλ“  κ΅¬ν˜„ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€.
λ”°λΌμ„œ κ°œλ°œμžλŠ” κ΅¬ν˜„ 클래슀 없이 μΈν„°νŽ˜μ΄μŠ€λ§Œ λ§Œλ“€λ©΄ κΈ°λ³Έ CRUD κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€.

쿼리 λ©”μ„œλ“œ κΈ°λŠ₯

μŠ€ν”„λ§ 데이터 JPAλŠ” μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ„œλ“œλ§Œ 적으면, λ©”μ„œλ“œ 이름을 λΆ„μ„ν•΄μ„œ 쿼리λ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€κ³  μ‹€ν–‰ν•΄μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

μŠ€ν”„λ§ 데이터 JPA

public interface MemberRepository extends JpaRepository<Member, Long> {
	List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}

μŠ€ν”„λ§ 데이터 JPAλŠ” λ©”μ„œλ“œ 이름을 λΆ„μ„ν•΄μ„œ ν•„μš”ν•œ JPQL을 λ§Œλ“€κ³  μ‹€ν–‰ν•œλ‹€. JPAκ°€ JPQL을 SQL둜 λ²ˆμ—­ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.

쿼리 λ©”μ„œλ“œ κΈ°λŠ₯ λŒ€μ‹ μ— 직접 JPQL을 μ‚¬μš©ν•˜κ³  싢을 땐 λ‹€μŒκ³Ό 같이 @Query와 ν•¨κ»˜ JPQL을 μž‘μ„±ν•˜λ©΄ λœλ‹€. 이 λ•ŒλŠ” λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” κ·œμΉ™μ€ λ¬΄μ‹œλœλ‹€.

//쿼리 직접 μ‹€ν–‰
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” κΈ°λŠ₯은 λ‹€μŒκ³Ό 같은 단점이 μžˆλ‹€.

  1. 쑰건이 많으면 λ©”μ„œλ“œ 이름이 λ„ˆλ¬΄ 길어진닀.
  2. join 같은 λ³΅μž‘ν•œ 쑰건을 μ‚¬μš©ν•  수 μ—†λ‹€.

λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” κΈ°λŠ₯은 κ°„λ‹¨ν•œ κ²½μš°μ—” 맀우 μœ μš©ν•˜μ§€λ§Œ, λ³΅μž‘ν•΄μ§ˆ 경우 직접 JPQL 쿼리λ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€.


정리
μŠ€ν”„λ§ 데이터 JPAλŠ” λ‹¨μˆœνžˆ νŽΈλ¦¬ν•¨μ„ λ„˜μ–΄μ„œ, λ§Žμ€ κ°œλ°œμžλ“€μ΄ λ˜‘κ°™μ€ μ½”λ“œλ‘œ 쀑볡 κ°œλ°œν•˜λŠ” 뢀뢄을 κ°œμ„ μ‹œμΌœ μ€€λ‹€.


ν† ν”½ 1개 - μžλ°” 버전별 차이점

+) 22. 09. 07. 02:18 μΆ”κ°€ (짱 κΈΈλ‹€...;)

JDK 1.0 (1991)

  • OAK(λ‹Ήμ‹œ μžλ°”μ˜ λͺ…μΉ­) λ°œν‘œ: C++의 단점을 κ·Ήλ³΅ν•˜κ³ μž λ§Œλ“  μ–Έμ–΄
  • λ©”λͺ¨λ¦¬ ν• λ‹Ή, ν•΄μ œμ˜ 어렀움과 닀쀑 μƒμ†μœΌλ‘œ μΈν•œ μ‹€μˆ˜ μœ λ°œμ„ κ·Ήλ³΅ν•˜λ € ν–ˆλ‹€.
  • 1996λ…„ Java둜 개λͺ…, Java Virtual Machine 1.0을 λ°œν‘œν–ˆλ‹€.

JDK 1.1 (1997)

  • JavaBeans, RMI, Reflection, Inner Class κ°œλ…μ΄ ν¬ν•¨λ˜μ—ˆλ‹€.

JDK 1.2 (1998)

  • Java SE 1.2, ME 1.2, EE 1.2 μ„Έ 가지 버전을 λ°œν‘œν•˜μ˜€λ‹€.
  • Swing이 SE에 ν¬ν•¨λ˜μ—ˆμœΌλ©°, JIT, Collection Framework 등이 μΆ”κ°€λ˜μ—ˆλ‹€.

JDK 1.3 (2000)

  • HotSpot(Sunμ—μ„œ λ§Œλ“  JIT κ΅¬ν˜„)
  • JNDI(디렉토리 및 μ΄λ¦„μœΌλ‘œ μ›ν•˜λŠ” μ„œλΉ„μŠ€λ₯Ό 찾음)

JDK 1.4 (2002)

  • Java Web Start 포함
  • JCP(Java Community Process)에 μ˜ν•΄μ„œ μ˜€ν”ˆμ†ŒμŠ€ μ •μ±…μœΌλ‘œ μžλ°”κ°€ κ΄€λ¦¬λ˜κΈ° μ‹œμž‘ν•œ 버전
  • API: Regular Expression, Assert keyword, Security 2 version, Non Blocking I/O

Java 1.5 (2004)

  • Generics, annotation, auto boxing, foreach, static imports, Enum λ“± λ„μž…

    //1.5 이전, μ»¬λ ‰μ…˜μ— κΈ°λ³Έ νƒ€μž…μ„ μ‚½μž…ν•˜λŠ” μ½”λ“œ
    List list = new ArrayList(10);
    list.add(new Integer(10)); //AutoBoxing, UnBoxing 지원 X
    //1.5 이후, μ»¬λ ‰μ…˜μ— κΈ°λ³Έ νƒ€μž…μ„ μ‚½μž…ν•˜λŠ” μ½”λ“œ
    List<Integer> list = new ArrayList<>();
    list.add(10);
  • API: java.util.concurrent API, scanner class

Java 6 (2006)

  • G1 가비지 컬렉터
  • μžλ°” 컴파일러 API

Java 7 (2011)

  • JVM: Dynamic Language support
  • File NIO 2.0
  • Fork/Join Framework
  • Language: try-with-resource, String in Switch, Generics λ‚΄ νƒ€μž… μΆ”λ‘ , μˆ«μžμ— under score μ‚¬μš© κ°€λŠ₯
  • JavaFXκ°€ 기본으둜 ν¬ν•¨λ˜μ—ˆλ‹€.
  • Generics λ‚΄ νƒ€μž… μΆ”λ‘ 
    이전 버전

    Map<String, Object> user = new HashMap<String, Object>();

    7 버전

    Map<String, Object> user = new HashMap<>();
  • Switch λ¬Έμ—μ„œ λ¬Έμžμ—΄ ν—ˆμš©

    switch (day) {
    	case "NEW": System.out.println("Order is in NEW state"); break;
    	case "CANCELED": System.out.println("Order is Canceled"); break;
    	default: Systme.out.println("Invalid");
    }
  • 7 λ²„μ „μ—μ„œλŠ” try with resource ꡬ문이 μΆ”κ°€λ˜μ–΄ μžλ™μœΌλ‘œ μžμ›μ„ close ν•œλ‹€. μ΄λŸ¬ν•œ λ§€μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” AutoCloseable, Closeable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.
    Java 7의 Streams, Files, Socket, DB Connection 등은 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€.

  • Fork/Join Framework
    Fork/Join FrameworkλŠ” λ©€ν‹° ν”„λ‘œμ„Έμ„œμ˜ μ„±λŠ₯을 μ΄μš©ν•  수 μžˆλŠ” ExecutorService의 μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ²΄μ΄λ‹€.
    μž‘μ—…μ„ 반볡적으둜 μž‘μ€ 쑰각으둜 λ‚˜λˆ„μ–΄ μˆ˜ν–‰ν•  수 있게 μ„€κ³„λ˜μ—ˆλ‹€.

Java 8 (2014)

  • λžŒλ‹€ 및 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°, Default Method in Interface, λ©”μ„œλ“œ μ°Έμ‘°(인자둜 method referenceλ₯Ό 전달)
  • new Date and Time API(LocalDateTime…), Stream API

Java 9 (2017)

  • Java용 REPL(Read Eval Print Loop), JShell λ“±μž₯
  • Modular System(jigsaw) 지원
  • λΆˆλ³€ Collection 제곡
  • Anonymous Inner ν΄λž˜μŠ€μ—μ„œ Diamond Operator μ‚¬μš© κ°€λŠ₯
  • μΈν„°νŽ˜μ΄μŠ€ λ‚΄ private λ©”μ„œλ“œ μ‚¬μš© κ°€λŠ₯
  • Reactive Stream API μΆ”κ°€
  • Optional to Stream(ifPresentOrElse())
  • HTTP2 Client

Java 10 (2018)

  • var ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•œ μ§€μ—­λ³€μˆ˜ νƒ€μž…μΆ”λ‘  κ°€λŠ₯
    //10 이전
    String name = "jangmi";
    //10 이후
    var name = "jangmi";
  • λ³‘λ ¬μ²˜λ¦¬ 가비지 μ»¬λ ‰μ…˜ λ„μž…μœΌλ‘œ μΈν•œ μ„±λŠ₯ ν–₯상
  • κ°œλ³„ μŠ€λ ˆλ“œλ‘œ λΆ„λ¦¬λœ Stop-The-World μΆ”κ°€
  • JVM Heap μ˜μ—­μ„ μ‹œμŠ€ν…œ λ©”λͺ¨λ¦¬κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ’…λ₯˜μ˜ λ©”λͺ¨λ¦¬μ—λ„ ν• λ‹Ή κ°€λŠ₯
  • Java 기반의 JIT(Just In Time) 컴파일러 μΆ”κ°€
  • Enhanced for Loopλ₯Ό μœ„ν•œ λ°”μ΄νŠΈ μ½”λ“œ 생성

Java 11 (2018. 09.)

  • Oracle JDK와 OpenJDK 톡합
  • Java EEκ°€ JDKμ—μ„œ μ‚­μ œλ˜κ³ , JavaFX도 JDKμ—μ„œ λΆ„λ¦¬λ˜μ–΄ λ³„λ„μ˜ λͺ¨λ“ˆλ‘œ μ œκ³΅λœλ‹€.
  • λžŒλ‹€ ν‘œν˜„μ‹μ—μ„œλ„ varλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜ μ„ μ–Έ κ°€λŠ₯
    • (String x) β†’ System.out.println(x) β‡’ (var x) β†’ System.out.println(x)
  • HTTP ν΄λΌμ΄μ–ΈνŠΈ ν‘œμ€€ν™” κΈ°λŠ₯ μΆ”κ°€
  • μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€μ— ToArray λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.
  • String 클래슀 κΈ°λŠ₯ μΆ”κ°€(isBlank(), lines(), strip() λ“±)

Java 12 (2019. 03.)

  • Switch문의 ν™•μž₯
    switch (day) {
    	case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    	case TUESDAY -> System.out.println(7);
    }

Java 13 (2019. 09.)

  • yield μ˜ˆμ•½μ–΄ μΆ”κ°€

Java 14 (2020. 03.)

  • recordλΌλŠ” 데이터 였브젝트 μ„ μ–Έ κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€.

    //데이터, (잠재적으둜)getter/setter, equals/hashcode, toString만 ν¬ν•¨ν•˜λŠ” Java 14 이전 클래슀
    final class Point {
    	public final int x;
    	public final int y;
       
    	public Point(int x, int y) {
    	this.x = x;
    	this.y = y;
    	}
    }
    //recordλ₯Ό μ‚¬μš©
    record Point(int x, int y) {}

Java 15 (2020. 09.)

  • sealed class(상속 κ°€λŠ₯ν•œ 클래슀λ₯Ό 지정 κ°€λŠ₯) μΆ”κ°€

Java 16

  • OpenJDK μ†ŒμŠ€λ₯Ό GitHubμ—μ„œ λ³Ό 수 있게 됐닀.
  • Unix-Domain Socket Channels

Java 17 (2021. 09.)

  • Java 11 이후 μƒˆλ‘œμš΄ Java LTS(μž₯κΈ° 지원) 릴리즈
  • μ˜μ‚¬λ‚œμˆ˜ 생성기λ₯Ό 톡해 μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ €μš΄ λ‚œμˆ˜λ₯Ό μƒμ„±ν•˜λŠ” API 정식 μΆ”κ°€

참고 자료

  1. μ„œμšΈiT아카데미, μžλ°”(Java) 버전별 νŠΉμ§•, http://www.seoulit.or.kr/service/cumm_08_view.html?type=faq&category_chk=&num_per_page=15&page=1&code_seq=NjA2Ng==

  2. Techvu, β€œμžλ°” 버전별 역사 및 νŠΉμ§•β€, https://techvu.dev/136

  3. ohne Hast aber ohne Rast, β€œ[JAVA] JDK 버전별 정리”, https://truehong.tistory.com/114

  4. juoh0920.log, β€œjava 버전별 차이 & νŠΉμ§•β€, https://velog.io/@ljo_0920/java-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4-%ED%8A%B9%EC%A7%95


ν•¨κ»˜ 보면 쒋은 자료

  • 개발자 μž₯κ³ , β€œ[개발자 λ©΄μ ‘ 질문] μžλ°” - 버전 νŠΉμ§•β€, https://youtu.be/_6YP2FNTt80

λ‚΄ 생각엔, μ•„λ¬΄λž˜λ„ μžλ°”κ°€ 크게 바뀐 뢀뢄이 8, 11 λ²„μ „μ΄λ‹ˆ μœ„ μ˜μƒμ— λ‚˜μ˜¨ κ²ƒλ“€λ§Œ 잘 μ•Œλ©΄ 크게 문제 될 건 없을 것 κ°™λ‹€.


μ½”ν…Œ 1문제

폰켓λͺ¬

public int solution(int[] nums) {
	int answer = 0;
	int nums_size = nums.length / 2;

	Integer[] numbers1 = Arrays.stream(nums).boxed().toArray(Integer[]::new);
	Set<Integer> numbers2 = new HashSet<>(Arrays.asList(numbers1));
	answer = (int) numbers2.stream().count();

	if (answer > nums_size) {
		return nums_size;
	}

	return answer;
}

문제 μ„€λͺ…은 λ„ˆλ¬΄ κΈΈμ–΄μ„œ μƒλž΅... 참고둜 λ‚΄ 닡은 1점^^ λ‚˜μ™”λ‹€^^
μ™œμ§€? 싢은데 λ‚΄κ°€ 봐도 μ½”λ“œκ°€ ꡬ린 것 κ°™κΈ΄ 함. 잘 풀은 μ‚¬λžŒμ€ 슀트림... λžŒλ‹€... 썼던데... λ‚œ 아직 κ±°κΈ°κΉŒμ§„... λ―Έν‘ν•΄μ„œ... κ³ μž‘ 1점밖에 λͺ» λ°›μ•˜λ‹€... κ·Έλž˜λ„ 풀은 게 μ–΄λ”˜κ°€ μ‹Άκ³ ? 사싀 문제 자체λ₯Ό 잘 이해 λͺ» ν–ˆλ‹€. μ–΄λ €μ›Œμž‰...

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보