🌏 WEB

ν˜„μž¬ λ„λ©”μΈμ˜ λ‚ μ§œμ™€ μƒˆλ‘œμš΄ λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λŠ” κ³Όμ •μ—μ„œ java.time.LoclaDate μ—μ„œ equals() λ₯Ό μ‚¬μš©ν•˜λŠ”λ° isEquals() 도 μžˆμ–΄μ„œ 확인해 λ΄€λ‹€. equals λŠ” λ…Όλ¦¬μ μœΌλ‘œ λ™λ“±ν•˜λ©΄ λœλ‹€ -> λ‚΄μš©μ΄ 같은가? isEqula 은 λ¬Όλ¦¬μ μœΌλ‘œλ„ 동등해야 ν•œλ‹€ -> 같은 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ”κ°€? ν•˜μ§€λ§Œ λ‚΄κ°€ μ›ν–ˆλ˜κ±΄ λ‘˜λ‹€ μ•„λ‹ˆμ˜€μŒ 도메인에 μžˆλŠ” λ‚ μ§œ μžμ²΄κ°€ null 일 수 μžˆλ‹€. equals λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 주체가 λ˜λŠ” object λŠ” null이면 μ•ˆλœλ‹€. μ•ˆμ „ν•œ 비ꡐλ₯Ό μœ„ν•΄ java.util.Obejcts 에 μžˆλŠ” equalsλ₯Ό μ‚¬μš©ν•œλ‹€. 근데 λ‘˜λ‹€ null 이면 true λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— null이 λ„˜μ–΄μ˜€λ©΄ return ν•΄λ²„λ¦¬λŠ” λ‘œμ§μ„ μΆ”κ°€ν–ˆλ‹€. public void updat..
Java 의 일반적인 문제 쀑 ν•˜λ‚˜λŠ” 높은 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μœΌλ‘œ 인해 μ„±λŠ₯, 좩돌이 λ°œμƒν•  수 μžˆλ‹€κ³  ν•œλ‹€. μ΅œμ ν™” 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ κ°μ†Œλ₯Ό μœ„ν•œ λͺ¨λ²• 사둀λ₯Ό μ‚΄νŽ΄λ³΄μž 1. Primitive type(μ›μ‹œνƒ€μž…) 을 μ‚¬μš©ν•˜μž. μ°Έμ‘°νƒ€μž… 보닀 μ›μ‹œνƒ€μž…μ„ μ‚¬μš©ν•œλ‹€. μ›μ‹œνƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ 개체 생성 μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•  수 μžˆλ‹€. + λ˜ν•œ μ›μ‹œνƒ€μž…μ€ μŠ€νƒ λ©”λͺ¨λ¦¬ μ—μ„œ λ°”λ‘œ 읽고, μ°Έμ‘°νƒ€μž…μ€ μŠ€νƒ λ©”λͺ¨λ¦¬μ—μ„œ νž™ λ©”λͺ¨λ¦¬μ˜ μœ„μΉ˜λ₯Ό κ΅¬ν•΄μ˜¨ λ‹€μŒμ— λ‹€μ‹œ νž™ λ©”λͺ¨λ¦¬μ— κ°€μ„œ 값을 읽어와야 ν•΄μ„œ μ„±λŠ₯상 μœ λ¦¬ν•˜λ‹€. 2. λΆˆν•„μš”ν•œ 객체 생성 ν•˜μ§€λ§μž. String s = "μ• μ •μ“°"+" μž…λ‹ˆλ‹€"; ν•΄λ‹Ή μ½”λ“œ ν•œμ€„μ€ "μ• μ •μ“° μž…λ‹ˆλ‹€" 에 λŒ€ν•œ μƒˆ λ¬Έμžμ—΄ 개체λ₯Ό λ§Œλ“­λ‹ˆλ‹€. λŒ€μ‹  StringBuilder λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ ..
jwt 토큰 을 μΆ”κ°€ν•˜λŠ” 도쀑 이미 μ‚¬μš©μ€‘μΈ μ„œλΉ„μŠ€κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ”κ±Έ μΆ”μƒν™”ν•˜λŠ” μž‘μ—…μ€‘μ— μ œλ„€λ¦­μ„ μ‚¬μš©ν•œ 후기이닀. μ„œλΉ„μŠ€ λ§ˆλ‹€ λ‹€λ₯Έ ν† ν°μœ μ§€ μ‹œκ°„, νŽ˜μ΄λ‘œλ“œλ₯Ό κ°–κ³  μžˆλŠ”λ° μ˜€λ²„λΌμ΄λ”©μ„ μ‚¬μš©ν•˜μ˜€λŠ”λ° μ½”λ“œλ¦¬λ·° λ•Œ 같은 κΈ°λŠ₯을 ν•˜λ©΄μ„œ μ•½κ°„μ˜ ν•„λ“œμΆ”κ°€λ§Œ λ˜λŠ”κ²ƒμ΄λΌμ„œ μ œλ„€λ¦­μ„ μ‚¬μš©ν•΄λ³΄λŠ”κ²Œ μ–΄λ–»λƒλŠ” ν”Όλ“œλ°±μ„ λ°›μ•˜λ‹€. λ¬Όλ‘  처음 μ¨λ³΄λŠ”κ±°λΌμ„œ μ‹œκ°„μ΄ 였래 κ±Έλ Έλ‹€. μž¬λ―Έμžˆμ—ˆκ³  μ‹ μ„Έκ³„μ˜€λ‹€ (μ œλŒ€λ‘œ 쓴것도 μ•„λ‹ˆμ§€λ§Œ) μ•„λž˜μ™€ 같이 μ œλ„€λ¦­ 클래슀λ₯Ό μƒμ„±ν•˜κ³  issue (ν† ν°λ°œν–‰) 을 μ‹€ν–‰ν–ˆμ„ λ•Œ μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ 생성 ν•˜μ˜€λ‹€ @Data @AllArgsConstructor public class TokenPayload { private T tokenPayload; public T getTokenPayload() { return ..
κ°„λ‹¨ν•œ κΈ°λ³Έ 등둝 νŽ˜μ΄μ§€λΌμ„œ λ‹€λ₯Έμ½”λ“œμ™€ λ˜‘κ°™μ΄ ν•˜λ‹€κ°€ μ•½κ°„ λ³€ν™”λ₯Ό μ£Όμ—ˆλ‹€. html μ—μ„œ ajax둜 μ„œλ²„μ—κ²Œ μš”μ²­ν• λ•Œ success 즉 톡신에 μ„±κ³΅ν•˜κ³  java μ—μ„œ return 으둜 ok (boolean) 을 λ‚΄λ €μ£Όλ©΄ message λ₯Ό 띄어쀀닀. const updateDriver = function () { if (confirm("λ“±λ‘ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?")) { $.ajax({ type: "POST", url: "/create", data: $("#createForm").serialize(), dataType: 'json', success: function (r) { alert(r.message); if (r.OK) { location.href = '/list'; } }, error: function (xh..
μ½”ν‹€λ¦° 곡뢀λ₯Ό μ‹œμž‘ν•˜λ €κ³  SpringBoot - kotlin ν”„λ‘œμ νŠΈλ₯Ό μ„ΈνŒ… ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ κ³΅μ‹λ¬Έμ„œ μ°Έκ³  ν•˜μ‹œλ©΄ 도움이 될것 κ°™μŠ΅λ‹ˆλ‹€ https://spring.io/guides/tutorials/spring-boot-kotlin/ 1. ν”„λ‘œμ νŠΈ 생성 μœ„μ™€ 같이 μ„ΈνŒ…ν•˜λŠ”λ° μŠ€ν”„λ§λΆ€νŠΈ 버전이 λ§ˆμŒμ— κ±Έλ Έλ‹€. μΈν…”λ¦¬μ œμ΄μ—μ„œ μ‚¬μš©κ°€λŠ₯ν•œ λ²„μ „μœΌλ‘œ μžλ™ μ„ΈνŒ…ν•΄μ€€κ²ƒ κ°™μ§€λ§Œ μ˜μ‹¬μŠ€λŸ¬μš΄ λ§ˆμŒμ— κ³΅μ‹ν™ˆνŽ˜μ΄μ§€μ— λ“€μ–΄κ°€ ν™•μΈν–ˆλ‹€. https://spring.io/projects/spring-boot#support μ•„λž˜λ‘œ μŠ€ν¬λ‘€μ„ 내리면 μƒ‰κΉ”μ˜ 의미λ₯Ό 확인할 수 μžˆλ‹€. μš°μ„  νŠΉλ³„νžˆ μ–΄λ–€ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν• μ§€ μƒκ°ν•΄λ‘”κ²Œ μ—†κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ νŠΈ μƒμ„±μ‹œ μ„€μ •λ˜μ–΄μžˆλŠ” 3.0.4 둜 ν”„λ‘œμ νŠΈλ₯Ό μ„ΈνŒ…ν•œλ‹€. Incompatible beca..
Hibernate κ°€ 뭐지? ν•˜μ΄λ²„λ„€μ΄νŠΈ ORM은 μžλ°” μ–Έμ–΄λ₯Ό μœ„ν•œ 객체 관계 맀핑 ν”„λ ˆμž„μ›Œν¬μ΄λ‹€. 객체 지ν–₯ 도메인 λͺ¨λΈμ„ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ§€ν•‘ν•˜κΈ° μœ„ν•œ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ œκ³΅ν•œλ‹€. JPA의 κ΅¬ν˜„μ²΄μ˜ ν•œ μ’…λ₯˜λ‘œ, JPA μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ JDBC API λ₯Ό μ‚¬μš©ν•œλ‹€. Hibernate λŠ” SQL 을 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œ 호좜만으둜 쿼리λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. ( SQL λ°˜λ³΅μž‘μ—…μ„ ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€ ) 컬럼이 λ³€κ²½λ˜μ—ˆμ„ λ•Œ, ν…Œμ΄λΈ”κ³Ό κ΄€λ ¨λœ DAO 의 νŒŒλΌλ―Έν„°, 쿼리 ,SQL 등을 λŒ€μ‹  μˆ˜ν–‰ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— νŠΉμ • 벀더사에 쒅속적이지 μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ€ μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œλ„ 큰 μž₯μ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Mysql 을 μ‚¬μš©ν•˜λ‹€κ°€ ORCLE 둜 λ³€κ²½ν•˜λ”λΌλ„ Hibernate λŠ” λ³€κ²½ν•œ ORCLE 둜 ..
개발 ν•˜λ©΄μ„œ λ‹Ήμ—°ν•œ λΆ€λΆ„μ΄μ˜€μ§€λ§Œ λ‚˜μ—κ² μƒˆλ‘­κ²Œ λ‹€κ°€μ™”λ˜ μ˜ˆμ™Έμ²˜λ¦¬ ... γ…œ 리뷰 ν•΄μ£Όμ‹œλŠ” λ§€λ‹ˆμ €λ‹˜μ΄ λ„ˆλ¬΄ 잘 μ•Œλ €μ£Όμ…”μ„œ 정리 ν•΄λ΄…λ‹ˆλ‹€ ( κ²©ν•œ 감사 πŸ₯Ή ) μ†Œμ œλͺ©μ΄ μ—°κ΄€λ˜μ–΄ μ΄μ–΄μ§€μ§€λŠ” μ•Šκ³  μƒν™©λ§ˆλ‹€ μ˜ˆμ™Έμ²˜λ¦¬ ν–ˆλ˜ 뢀뢄을 λ©”λͺ¨ν–ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ™Έ λ°œμƒ μ‹œ 쑰치λ₯Ό λͺ»ν•˜λŠ” 경우 & κ΄€λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우 POINT * λ°œμƒν• λ§Œ κ³³ μ—μ„œ catch ν›„ λ©”μ‹œμ§€λ₯Ό μ λŠ”λ‹€. (μ˜ˆμ™Έμƒν™©μ„ μ •ν™•νžˆ μ„œμˆ ν•œλ‹€) * μ–Έμ²΄ν¬μ˜ˆμ™Έλ‘œ λ³€κ²½ν•œλ‹€. μ˜ˆμ™Έλ₯Ό μž‘μ§€ λͺ»ν•˜λ©΄ μžλ°”μ—μ„œλŠ” ν•΄λ‹Ή 정보λ₯Ό μžλ™μœΌλ‘œ 좜λ ₯ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ‹€νŒ¨μ›μΈμ„ 뢄석할 λ•Œ λ³Ό 수 μžˆλŠ” μ •λ³΄λŠ” μŠ€νƒμ •λ³΄μΌ κ²½μš°κ°€ 많기 λ•Œλ¬Έμ— log 둜 μ˜ˆμ™Έλ₯Ό κ΄€λ¦¬ν•˜κ³  μžˆλ‹€λ©΄ μ‹€νŒ¨ 원인에 κ΄€ν•œ 정보λ₯Ό κ°€λŠ₯ν•œ 많이 λ‹΄μ•„ λ°˜ν™˜ν•˜μ—¬ μΆ”μ ν•˜κΈ° 쉽도둝 ν•˜λŠ”κ²Œ μ€‘μš”ν•©λ‹ˆλ‹€! 1. λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•œ λͺ¨λ“  κ°’..
νšŒμ‚¬ μ½”λ“œλ₯Ό λΆ„μ„ν•˜λ‹€κ°€ ν•¨μˆ˜ν˜•μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ 뢀뢄이 μžˆμ–΄μ„œ κ³΅λΆ€ν•΄λ³΄μ•˜λ‹€. μ‚¬μš©ν•œ λͺ©μ μ€ ν•΄λ‹Ή EnumType 을 μ‚¬μš©ν•˜λ©΄ κ·Έ Enum에 맞게 배열을 μ •λ ¬ν–ˆμŠ΅λ‹ˆλ‹€. μ‹ μ„ ν•œ 좩격을 λ°›μ•˜μŠ΅λ‹ˆλ‹€ ..γ…Ž.. κ·Έλž˜μ„œ 저도 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•΄λ³΄κ³  κ³΅λΆ€ν•΄λ΄€μŠ΅λ‹ˆλ‹€! package com.example.demo; import java.util.function.Function; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public enum ItemType { AA("μƒμˆ˜",CalRatio::getRatio), BB("음료",CalRatio::getRatio), CC("과자",CalRatio::get..
λ™κΈ°λΆ„μ˜ λ„μ›€μœΌλ‘œ 처음으둜 Interceptor λ₯Ό μ μš©ν•΄λ³΄μ•„μ„œ λ‚˜μ€‘μ— μ‚¬μš©ν•  일이 μžˆμ„ λ•Œ 찾아보렀고 μ¨λ΄…λ‹ˆλ‹€! μ•„λž˜μ™€ 같은 Controller 에 Header μ—μ„œ 인증을 μœ„ν•œ 값을 λ°›μ•„μ•Όμ§€λ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€! @RestController @RequestMapping("/orders") @RequiredArgsConstructor public class OrdersController { private final OrdersService ordersService; @Auth(type = ApiServiceType.HOMEPAGE) @GetMapping public ResponseEntity getOrders( @RequestParam(required = false) String sear..
TDD 개발 방식 TDD λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•œ 뒀에 μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이닀. ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όλœ μ½”λ“œλ§Œμ„ μ‹€μ œ μ½”λ“œλ‘œ μž‘μ„±ν•œλ‹€ -> 버그가 쀄고 μ†ŒμŠ€κ°€ 간결해지며 섀계가 κ°œμ„ λœλ‹€. - 섀계 λ‹¨κ³„μ—μ„œ ν”„λ‘œκ·Έλž˜λ° λͺ©μ μ„ 미리 μ •μ˜ν•œλ‹€. - 무엇을 ν…ŒμŠ€νŠΈν•΄μ•Ό 할지 미리 μ •μ˜ν•œλ‹€. - ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± 도쀑 λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 사항을 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— μΆ”κ°€ν•œλ‹€. (섀계 κ°œμ„ ) TDD ν”„λ‘œμ„ΈμŠ€ μ‹€νŒ¨ν•˜λŠ” μž‘μ€ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μΆ”κ°€ -> ν…ŒμŠ€νŠΈ 톡과, μ΅œμ†Œν•œμ˜ μ½”λ”© -> κ΅¬ν˜„ 섀계 κ°œμ„ , 쀑볡 제거, λ¦¬νŒ©ν† λ§ , ν…ŒμŠ€νŠΈ 톡과 μœ μ§€ 쒋은 ν…ŒμŠ€νŠΈμ˜ νŠΉμ§• Fast: ν…ŒμŠ€νŠΈλŠ” λΉ λ₯΄κ²Œ λ™μž‘ν•˜μ—¬ 자주 돌릴 수 μžˆμ–΄μ•Ό ν•œλ‹€. Independent: 각각의 ν…ŒμŠ€νŠΈλŠ” 독립적이며 μ„œλ‘œ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€. Repeatable: μ–΄λŠ ν™˜κ²½μ—μ„œ..
Java 8 μ΄ν›„λ‘œ interface에 λŒ€ν•œ μ •μ˜κ°€ λͺ‡κ°€μ§€ λ³€κ²½λ˜μ—ˆλ‹€. 상황 이미 λ§Œλ“€μ–΄μ Έ μžˆλŠ” Interface 에 κΈ°λŠ₯을 μΆ”κ°€ ν•˜κ³  μ‹Άλ‹€. ν•˜μ§€λ§Œ 이 Interfaceλ₯Ό implemnets λ°›κ³  μžˆλŠ” class λͺ¨λ‘κ°€ 이 κΈ°λŠ₯의 κ΅¬ν˜„μ²΄λ₯Ό μƒμ„±ν•΄μ•Όλ§Œ ν•œλ‹€. default λ©”μ„œλ“œ μΈν„°νŽ˜μ΄μŠ€κ°€ default ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜λ©΄ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 있게 λœλ‹€. -> κ΅¬ν˜„μ²΄λ“€μ€ μ˜€λ²„λΌμ΄λ”©μ΄ κ°€λŠ₯ν•˜λ‹€. package com.example.demo; public interface UserService { String getName(Long userId); int getAge(Long userId); /** * @implSpec 이 κ΅¬ν˜„μ²΄λŠ” μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. * @param userId * @return */ // ..
πŸƒβ€β™‚οΈ κ³„μ†ν•΄μ„œ μ—…λ°μ΄νŠΈ ν•˜κΈ° πŸƒβ€β™‚οΈ 1. κ³΅μ‹λ¬Έμ„œ 2. μ™œ μ‚¬μš©ν• κΉŒ? 3. λ™μž‘λ°©μ‹ 4. μ˜μ‘΄μ„± 5. Mapper Inteface μž‘μ„± 6. Mapper κ΅¬ν˜„μ²΄ μ‚΄νŽ΄λ³΄κΈ° κ³΅μ‹λ¬Έμ„œ https://mapstruct.org/documentation/stable/reference/pdf/mapstruct-reference-guide.pdf MapStruct μ™œ μ‚¬μš©ν• κΉŒ? 보톡 DBμ—μ„œ 데이터λ₯Ό μ‘°νšŒν•˜κ³  μ„œλΉ„μŠ€λ‹¨μ—μ„œ λ‘œμ§μ„ 섀계 ν•˜κΈ° μœ„ν•΄ Entity -> Dto , Dto -> Entity μž‘μ—…μ„ ν•˜κ²Œ λ˜λŠ”λ° μ΄λŸ¬ν•œ Mapping μž‘μ—…μ„ ν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 많이 μ‘΄μž¬ν•œλ‹€ 그쀑 μ•„λž˜μ˜ 링크λ₯Ό 확인해보면 MapStruct νΌν¬λ¨ΌμŠ€κ°€ λΉ λ₯Έ 것을 확인할 수 μžˆλ‹€. https://www.baeldung.com/j..
μ• μ •μ“°
'🌏 WEB' μΉ΄ν…Œκ³ λ¦¬μ˜ κΈ€ λͺ©λ‘