전체 κΈ€

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..
μΆ”κ°€λ˜λŠ”κ²ƒλ„ μˆ˜μ •ν• κ²ƒλ„ λ§Žμ•„ λλ‚˜μ§€ μ•Šμ„κ²ƒ κ°™λ˜ ν”„λ‘œμ νŠΈκ°€ λ§ˆλ¬΄λ¦¬λ˜μ–΄ κ°„λ‹€. 쀑간쀑간 같이 κ°œλ°œν•˜λ˜ κ°œλ°œμžλΆ„μ΄ λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ— 도움이 ν•„μš”ν•΄ 혼자 κ°œλ°œμ„ ν•΄μ•Ό ν–ˆλ˜ 기간이 μžˆμ—ˆλ‹€. κΈ°κ°„μ•ˆμ— 끝내지 λͺ»ν• κΉŒλ΄ λ„ˆλ¬΄ λΆˆμ•ˆν–ˆλ‹€. (그만큼 λ„ˆλ¬΄ μ˜μ§€ν•˜λ €κ³  ν–ˆμ—ˆλ‹€λŠ”κ±Έ κΉ¨λ‹¬μ•˜λ‹€ πŸ˜”) μ–΄λ“œλ―Ό νŽ˜μ΄μ§€μΈλ§ŒνΌ 보톡 API κ°œλ°œλ³΄λ‹€ 훨씬 λ³΅μž‘ν•˜κ³  μ˜€λž˜κ±Έλ ΈλŠ”λ° μ‹€μˆ˜ν•΄μ„œ λ‹€μ‹œ μ›λ³΅ν–ˆλ˜ 뢀뢄듀도 λ§Žμ•˜λ‹€.(기획적으둜) λ§€λ‹ˆμ €λ‹˜κ»˜μ„œ 쀑간쀑간 ν”Όλ“œλ°±κ³Ό 확인을 ν•΄μ£Όμ…”μ„œ λ„ˆλ¬΄ 큰 도움이 λ˜μ–΄μ„œ λ‹€ν–‰μ΄μ§€λ§Œ(또 ν˜Όμžν–ˆμœΌλ©΄ 정말 μ’Œμ ˆν–ˆμ„κ²ƒ κ°™λ‹€...) μƒνƒœλ³€ν™”μ— λŒ€ν•œ μœ νš¨μ„± 검사 ν•˜κΈ° state machine 을 μ•Œλ €μ£Όμ…”μ„œ κ²€μƒ‰ν•˜μ—¬ μ•„μ΄νŒ¨λ“œλ‘œ λΉ„μŠ·ν•˜κ²Œ μž‘μ„±ν–ˆλ‹€. μ£Όλ¬Έμƒνƒœμ— λ”°λ₯Έ λ³€ν™”κ°€ λ³΅μž‘ν•˜κ²Œ λ˜μ–΄μžˆμ–΄μ„œ μ΄ν•΄ν•˜λŠ”λ° λ§Žμ€ μ‹œκ°„μ΄ κ±Έλ Έλ‹€. 이미 μ‘΄..
ν•˜ λ‚΄ μ‹œκ°„.... No property xxxx found for type xxx 기쑴에 있던 repository μ—μ„œ μΆ”κ°€μ μœΌλ‘œ querydsl 을 μ‚¬μš©ν•˜λ €κ³  custom interface 와 impl class λ₯Ό μƒμ„±ν–ˆλ‹€ κ³„μ†ν•΄μ„œ μŠ€ν”„λ§μ΄ λΉˆμ„ λͺ»μ°Ύμ•„μ„œ ꡬ글링 해보고 λ©”μ„œλ“œ 이름도 λ°”κΎΈλ©° μ—¬λŸ¬κ°€μ§€ μ‹œλ„ν•˜λ‹€κ°€ λ‹€μŒ λΈ”λ‘œκ·ΈκΈ€μ„ λ°œκ²¬ν–ˆλ‹€. https://www.skyer9.pe.kr/wordpress/?p=6507 QueryDSL No property λ©”μ†Œλ“œλͺ… found for type μ—”ν„°ν‹°λͺ…! – μƒκ΅¬λ¦¬μ˜ 기술 λΈ”λ‘œκ·Έ QueryDSL No property λ©”μ†Œλ“œλͺ… found for type μ—”ν„°ν‹°λͺ…! 클래슀λͺ… xxxRepository xxxRepositoryCustom xxxRepositoryImp..
개발자둜 μ·¨μ—…ν•˜μ—¬ 2λ…„μ΄λΌλŠ” μ‹œκ°„μ΄ 지났닀. μ–΄λ–€ ν”„λ‘œμ νŠΈλ₯Ό ν–ˆκ³  뭘 ν–ˆκ³ λ₯Ό μ“°μ§€λŠ” λͺ»ν•  것 κ°™λ‹€. λ‚΄κ°€ 뭘 ν•  수 있고 ν–ˆλŠ”μ§€ 기얡이 μ•ˆλ‚œλ‹€... μ•žμœΌλ‘œ κΎΈμ€€ν•˜κ²Œ κΈ°λ‘μ΄λ‚˜ 회고λ₯Ό ν•΄μ•Ό ν•  것 κ°™μ•„ λ‹¬λ§ˆλ‹€ 회고λ₯Ό μ“°κΈ°λ‘œ ν–ˆλ‹€. κ°œλ°œμžλ‘œμ„œμ˜ μ„±μž₯ κ°œμ„ ν•΄μ•Όν•  점 쑰급함: κ°œλ°œμ„ μ‹œμž‘ν–ˆμ„ λ•Œμ™€ λΉ„κ΅ν–ˆμ„ λ•Œ 많이 μ„±μž₯ν–ˆμ§€λ§Œ μ—­μ‹œ μ„Έμƒμ—λŠ” μ—„μ²­λ‚œ μ‚¬λžŒμ΄ λ„ˆλ¬΄ λ§Žλ‹€ μ‘°κΈ‰ν•΄ν•˜μ§€ μ•Šλ„λ‘ λ…Έλ ₯ν•˜μž νœ΄μ‹: νœ΄μ‹ν•  λ•ŒλŠ” 일 생각을 ν•˜μ§€ 말자 비ꡐ: 속도가 λŠλ¦°κ±°μ§€ λ©ˆμΆ°μžˆλ‹€κ³  μƒκ°ν•œ 적은 μ—†μœΌλ‹ˆκΉŒ λΉ„κ΅ν•˜μ§€ μ•Šλ„λ‘ λ…Έλ ₯ν•˜μž 약속: 일정을 λ§žμΆ”κΈ°κ°€ λ„ˆλ¬΄ μ–΄λ ΅λ‹€ 곡뢀: 자꾸 ν•‘κ³„λŒ€λ©΄μ„œ μ•ˆν•˜κ²Œ λœλ‹€. μ§€κΈˆ ν•˜λ˜ κ±° 라도 λ§ˆλ¬΄λ¦¬ν•΄λ³΄μž μž˜ν–ˆλ˜ 점 아직 ν¬κΈ°ν•˜μ§€ μ•Šμ•˜λ‹€ 사싀 λ‚΄κ°€ κ°œλ°œμ— μœ λ¦¬ν•œ 성격은 μ•„λ‹ˆλ‹€. 논리적인 λΆ€λΆ„μ—μ„œ μ•½ν•˜κ³  쉽..
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 */ // ..
μ• μ •μ“°
μ• μ •μ½”λ”© πŸ’»