λΆ„λ₯˜ 전체보기

개발 ν•˜λ©΄μ„œ λ‹Ήμ—°ν•œ λΆ€λΆ„μ΄μ˜€μ§€λ§Œ λ‚˜μ—κ² μƒˆλ‘­κ²Œ λ‹€κ°€μ™”λ˜ μ˜ˆμ™Έμ²˜λ¦¬ ... γ…œ 리뷰 ν•΄μ£Όμ‹œλŠ” λ§€λ‹ˆμ €λ‹˜μ΄ λ„ˆλ¬΄ 잘 μ•Œλ €μ£Όμ…”μ„œ 정리 ν•΄λ΄…λ‹ˆλ‹€ ( κ²©ν•œ 감사 πŸ₯Ή ) μ†Œμ œλͺ©μ΄ μ—°κ΄€λ˜μ–΄ μ΄μ–΄μ§€μ§€λŠ” μ•Šκ³  μƒν™©λ§ˆλ‹€ μ˜ˆμ™Έμ²˜λ¦¬ ν–ˆλ˜ 뢀뢄을 λ©”λͺ¨ν–ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ™Έ λ°œμƒ μ‹œ 쑰치λ₯Ό λͺ»ν•˜λŠ” 경우 & κ΄€λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우 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..
πŸƒβ€β™‚οΈ κ³„μ†ν•΄μ„œ μ—…λ°μ΄νŠΈ ν•˜κΈ° πŸƒβ€β™‚οΈ λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ 2022/03/29 1. Querydsl 을 μ™œ μ‚¬μš©ν• κΉŒ? 2. μž‘λ™λ°©μ‹? 3. μ˜μ‘΄μ„± 4. Repository ꡬ쑰 5. Projection 의 λŒ€ν•œ κ³ μ°° ... 6. 동적쿼리 (BooleanBuilder) 7. ExpressionUtils 8. μ •λ ¬ νƒ€μž…μ— λ”°λ₯Έ μ •λ ¬ 처리 Querydsl 을 μ™œ μ‚¬μš©ν• κΉŒ? JPA λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ (@Query 포함) 쑰회 κΈ°λŠ₯에 λŒ€ν•œ ν•œκ³„κ°€ μžˆλ‹€. 동적인 쿼리인 경우인데 예λ₯Ό λ“€μ–΄ μ£Όλ¬Έ νŽ˜μ΄μ§€λ₯Ό 검색 ν•œλ‹€κ³  ν–ˆμ„ λ•Œ μΉ΄ν…Œκ³ λ¦¬ or μƒν’ˆλͺ… or κΈ°μ—…λͺ… λ“±λ“±... 으둜 검색 쑰건이 λ‹¬λΌμ§€λŠ” 뢀뢄이닀. κ·Έλž˜μ„œ μ‚¬μš©ν•˜κ²Œ 된 것이 λ°”λ‘œ Querydsl ν”„λ ˆμž„μ›Œν¬ 이닀. - νƒ€μž… 체크가 λ°”λ‘œ κ°€λŠ₯ν•˜λ‹€ - μžλ°” μ½”λ“œλ₯Ό 기반으..
μ»΄νŒŒμΌκ³Όμ •μ—μ„œ 생성해 μ£ΌλŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” javaλΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. @Value 기본적으둜 λΆˆλ³€κ°μ²΄λ‘œ λ§Œλ“€μ–΄μ€€λ‹€. class에 μ„ μ–Έν•˜λ©΄ μ•„λž˜μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 기본적으둜 ν¬ν•¨λœλ‹€. @Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) ν•˜μ§€λ§Œ @Setter λŠ” ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€. μ™œλƒν•˜λ©΄ 기본적으둜 λΆˆλ³€μ„±μ„ 보μž₯ν•˜κΈ° λ•Œλ¬Έμ— setterλ₯Ό μƒλž΅ν•˜λŠ” 것은 λ‹Ήμ—°ν•˜λ‹€ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) λŠ” privateμ΄λ‚˜ final 을 μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€. μ΅œμ’…μ μœΌλ‘œ @Value ..
HTTP / HTTPS - HTTP : μ„œλ‘œ λ‹€λ₯Έ μ‹œμŠ€ν…œλ“€ μ‚¬μ΄μ—μ„œ 톡신을 μ£Όκ³ λ°›κ²Œ ν•˜λŠ” κ°€μž₯ 기본적인 ν”„λ‘œν† μ½œ(μ„œλ²„μ—μ„œ λΈŒλΌμš°μ €λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜λŠ” μš©λ„λ‘œ κ°€μž₯ 많이 μ‚¬μš©ν•¨) 문제점 - μ„œλ²„μ—μ„œ λΈŒλΌμš°μ €λ‘œ μ „μ†‘λ˜λŠ” 정보가 μ•”ν˜Έν™”λ˜μ§€ μ•ŠλŠ”λ‹€. - HTTPS : SSL(λ³΄μ•ˆ μ†ŒμΌ“ 계측) μ‚¬μš©, μ„œλ²„μ™€ λΈŒλΌμš°μ € 사이에 μ•ˆμ „ν•˜κ²Œ μ•”ν˜Έν™”λœ 연결을 λ§Œλ“€ 수 있게 도와쀀닀. μ„œλ²„μ™€ λΈŒλΌμš°μ €κ°€ λ―Όκ°ν•œ 정보λ₯Ό 주고받을 λ•Œ ν•΄λ‹Ή 정보가 λ„λ‚œλ‹Ήν•˜λŠ” 것을 λ§‰μ•„μ€Œ. HTTP 자체λ₯Ό μ•”ν˜Έν™”ν•˜λŠ” 것이 μ•„λ‹Œ HTTP Message Bodyλ₯Ό μ•”ν˜Έν™”ν•œλ‹€. (즉, HeaderλŠ” μ•”ν˜Έν™”λ˜μ§€ μ•ŠλŠ”λ‹€) HTTPS μ‚¬μš©ν•΄μ•Όν•˜λŠ” 이유 1. 쀑간에 데이터λ₯Ό κ°€λ‘œμ±„λ„ μ•”ν˜Έν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ— μ•ˆμ „ν•˜λ‹€. 2. ꡬ글은 HTTPS μ›Ή μ‚¬μ΄νŠΈμ— 가산점을 ..
μŠ€λ ˆλ“œν’€μ€ μž‘μ—… μ²˜λ¦¬μ— μ‚¬μš©λ˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œν•œλœ 개수만큼 μ •ν•΄ 놓고 μž‘μ—… 큐에 λ“€μ–΄μ˜€λŠ” μž‘μ—…λ“€μ„ ν•˜λ‚˜μ”© μŠ€λ ˆλ“œκ°€ 맑아 μ²˜λ¦¬ν•œλ‹€. 병렬 μž‘μ—… μ²˜λ¦¬κ°€ λ§Žμ•„μ§€λ©΄ μŠ€λ ˆλ“œ κ°œμˆ˜κ°€ μ¦κ°€λ˜λŠ”λ° 그에 λ”°λ₯Έ μŠ€λ ˆλ“œ 생성, μŠ€μΌ€μ€„λ§μœΌλ‘œ 인해 CPUκ°€ λ°”λΉ μ Έ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λŠ˜μ–΄λ‚œλ‹€. λ”°λΌμ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯이 μ €ν™” λ˜λ―€λ‘œ μŠ€λ ˆλ“œ 풀을 μ‚¬μš©ν•˜μ—¬ μŠ€λ ˆλ“œ 전체 κ°œμˆ˜κ°€ λŠ˜μ–΄λ‚˜μ§€ μ•Šλ„λ‘ ν•΄μ•Όν•œλ‹€. μŠ€λ ˆλ“œν’€ 생성 public class ExecutorExample { public static void main(String[] args) { // 1개의 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μŠ€λ ˆλ“œν’€ 생성 ExecutorService singleThread = Executors.newSingleThreadExecutor(); // μŠ€λ ˆλ“œλ₯Ό μ œν•œ 없이 사..
데λͺ¬ μŠ€λ ˆλ“œ μ£Ό μŠ€λ ˆλ“œμ˜ μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œμž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ£Ό μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ 데λͺ¬ μŠ€λ ˆλ“œλŠ” κ°•μ œμ μœΌλ‘œ μžλ™ μ’…λ£Œλ©λ‹ˆλ‹€. 적용 μ˜ˆλ‘œλŠ” μžλ™ μ €μž₯, 가비지 컬렉터 등이 μžˆλŠ”λ° 이 κΈ°λŠ₯듀은 μ£Ό μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ 같이 μ’…λ£Œλ©λ‹ˆλ‹€. 데λͺ¬ μŠ€λ ˆλ“œ λ‚΄μš©μ„ μž‘μ„±ν•΄μ€€ ν›„ public class DaemonThread extends Thread{ public void save(){ // μžλ™ μ €μž₯ } public void run(){ save(); } } 메인 μŠ€λ ˆλ“œμ—μ„œ setDaemon 을 ν•΄μ£Όλ©΄ λœλ‹€. public class mainThread(){ public static void main(String[] args){ DaemonThread daemonThread = new Dae..
μŠ€λ ˆλ“œλŠ” μ‹€ν–‰λŒ€κΈ° μƒνƒœμ™€ μ‹€ν–‰ μƒνƒœλ₯Ό λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μžμ‹ μ˜ run() λ©”μ„œλ“œλ₯Ό μ‘°κΈˆμ”© μ‹€ν–‰ν•©λ‹ˆλ‹€. κ·Έ ν›„ 더이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ 없을 λ•Œ μ’…λ£Œ μƒνƒœκ°€ λ©λ‹ˆλ‹€. μŠ€λ ˆλ“œ 객체 생성 -> start() -> μ‹€ν–‰λŒ€κΈ°(μŠ€μΌ€μ€„λ§μœΌλ‘œ 인해) μ‹€ν–‰ -> μ’…λ£Œ - μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μœΌλ‘œ μ„ νƒλœ μŠ€λ ˆλ“œκ°€ cpuλ₯Ό μ μœ ν•˜κ³  run() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€ (μ‹€ν–‰ μƒνƒœ) - μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μ— μ˜ν•΄ λ‹€μ‹œ μ‹€ν–‰λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€.(μ‹€ν–‰λŒ€κΈ° μƒνƒœ) μ–΄λ–»κ²Œ μ œμ–΄ν• κΉŒ? 1. 주어진 μ‹œκ°„λ™μ•ˆ μΌμ‹œ 정지 sleep() μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œλ₯Ό 일정 μ‹œκ°„ 멈좜 수 있게 ν•œλ‹€. Thread 클래슀의 정적 λ©”μ„œλ“œμΈ sleep() 을 μ‚¬μš©ν•œλ‹€. Thread.sleep(1000) // 1초 -> λ°€λ¦¬μ„Έμ»¨λ“œ (1/1000) λ‹¨μœ„ * 주어진 μ‹œκ°„μ΄ λ˜κΈ°μ „..
μ• μ •μ“°
'λΆ„λ₯˜ 전체보기' μΉ΄ν…Œκ³ λ¦¬μ˜ κΈ€ λͺ©λ‘ (3 Page)