Programming 33

[Spring Security] @AuthenticationPrincipal Test Trouble Shooting

λ“€μ–΄κ°€κΈ° μ•žμ„œ ν˜„μž¬ νšŒμ‚¬μ—μ„œλŠ” 자체적인 토큰 생성 λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄ μœ μ € 토큰을 μƒμ„±ν•˜κ³  이λ₯Ό Memcached 에 μ €μž₯ν•œ λ’€ 웹인 경우 Cookie λ₯Ό, 앱인 경우 Http Header 에 λ‹΄κΈ΄ 값을 톡해 μœ μ € 인증 정보λ₯Ό ν™•μΈν•˜λŠ” ꡬ쑰둜 μ²˜λ¦¬ν•˜κ³  μžˆλŠ”λ°, μŠ€μΌ€μΌ μ•„μ›ƒμœΌλ‘œ μ„œλ²„λ₯Ό μš΄μ˜ν•˜κ³  μžˆμ–΄ μœ μ € 인증 정보λ₯Ό μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„μ—μ„œ ν•¨κ»˜ κ³΅μœ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ‹€λ§Œ, μœ μ € 인증/인가 처리λ₯Ό Filter κ°€ μ•„λ‹Œ λ³„λ„μ˜ 인증용 클래슀λ₯Ό λ§Œλ“€κ³  인증 처리 λ©”μ†Œλ“œμ— @ModelAttribute λ₯Ό λΆ™μ—¬ 맀 μš”μ²­ λ§ˆλ‹€ 인증 정보λ₯Ό ν™•μΈν•˜κ³  μžˆμ–΄ λΆˆν•„μš”ν•œ μžμ›μ΄ λ‚­λΉ„λ˜κ³  μžˆλŠ” 상황이닀. λ•Œλ¬Έμ— Spring Security 에 μ΅μˆ™μΉ˜λ„ μ•Šκ³ , μ–Έμ  κ°€ νšŒμ‚¬μ˜ λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό κ°œμ„ ν•  수 μžˆμ„ 것 κ°™μ•„ λΉ„μ‚¬μ΄λ“œ μ‚¬μ΄λ“œ ν”„..

Programming/Spring 2023.04.08

[QueryDSL] NoSuchMethodError Trouble Shooting

λ“€μ–΄κ°€κΈ° μ•žμ„œ ν˜„μž¬ QueryDSL 5.0.0 버전을 기반으둜 ν”„λ‘œμ νŠΈ κ°œλ°œμ„ μ§„ν–‰ν•˜κ³  μžˆλŠ”λ°, λ³΅μž‘ν•œ 연관관계λ₯Ό κ°€μ§€λŠ” ν…Œμ΄λΈ”μ„ JPA Mapping 을 μ‚¬μš©ν•΄ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•  경우 λ„ˆλ¬΄ λ§Žμ€ 쿼리λ₯Ό μš”μ²­ν•˜κ²Œ λ˜μ–΄ λΆˆν•„μš”ν•œ μžμ›μ„ μ‚¬μš©ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ @Query μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ λ ˆνΌμ§€ν† λ¦¬μ— 쑰회 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것을 κ³ λ € ν–ˆμ§€λ§Œ λ‹€μŒκ³Ό 같은 이유둜 λ°˜λ €ν–ˆλ‹€. μ—¬λŸ¬ ν…Œμ΄λΈ”μ„ ν•œ λ²ˆμ— μ‘°νšŒν•΄ ν•˜λ‚˜μ˜ 도메인 클래슀둜 μž¬κ΅¬μ„±ν•΄μ•Ό ν•˜λ©°, μ—¬λŸ¬ 쑰건의 κ²°κ³Όλ₯Ό GroupBy ν•˜μ—¬ μž„λ² λ””λ“œ 클래슀의 ν•„λ“œμ— ν• λ‹Ήν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ @Query μ• λ…Έν…Œμ΄μ…˜μ€ κ΅¬ν˜„μ΄ μ–΄λ €μšΈ 것이라고 μƒκ°ν–ˆλ‹€. νŠΉμ • μ—”ν‹°ν‹°μ˜ λ ˆνΌμ§€ν† λ¦¬μ— @Query λ₯Ό μ‚¬μš©ν•΄ 쑰회 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것은 ν•΄λ‹Ή λ ˆνΌμ§€ν† λ¦¬..

Programming/Spring 2023.02.22

Criteria API

Goal Criteria API CriteriaBuilder CriteriaQuery Criteria API Java Persistence Criteria API λŠ” JPQL 의 λ¬Έμžμ—΄ 기반 μ ‘κ·Ό 방식을 μ΄μš©ν•˜λŠ” λŒ€μ‹  객체 기반 쿼리 μ •μ˜ 개체의 ꡬ성을 톡해 동적 쿼리λ₯Ό μ •μ˜ν•˜λŠ”λ° μ‚¬μš©λœλ‹€. Critera API μ—λŠ” type-restricted mode, non-typed mode 둜 λ‚˜λ‰˜λ©°, λŸ°νƒ€μž„ μ‹œ λ™μ μœΌλ‘œ 쑰회 λΉŒλ“œλ₯Ό 지원해 μ»΄νŒŒμΌλŸ¬κ°€ 검증할 수 μžˆλ„λ‘ ν•œλ‹€. λ˜ν•œ Criteria API λŠ” 동적 μΏΌλ¦¬μ—λ§Œ μ‚¬μš©λ˜μ–΄ 메타데이터 λ˜λŠ” Named Query μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μœΌλ©° 동적 μΏΌλ¦¬μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμ–΄ 기쑴의 정적 Named Query 에 λΉ„ν•΄ μ„±λŠ₯이 λ›°μ–΄λ‚˜μ§€ μ•Šλ‹€. κ·ΈλŸ¬ν•œ 이유둜 JPA ..

Programming/Spring 2023.01.28

Spring Bean / IoC Container / DI

Goal Spring Bean Spring IoC Container Dependency Injection (DI) Constructor Injection Method Injection Setter Injectio Spring Bean Spring Bean 으둜 λ“±λ‘λœ ν΄λž˜μŠ€λŠ” IoC Contrainer 에 μ˜ν•΄ μƒμ„±λœ Singleton 객체λ₯Ό μ˜λ―Έν•˜λ©°, Bean 으둜 λ“±λ‘λœ 클래슀만 μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 μ˜μ‘΄μ„±μ΄ μ£Όμž…(Dependency Injection)λ˜μ–΄ 객체의 생λͺ…μ£ΌκΈ°λ₯Ό κ°œλ°œμžκ°€ μ•„λ‹Œ μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•˜λ„λ‘ ν•œλ‹€. Register Bean @Bean @Bean 은 @Configuration 이 뢙은 DI μ„€μ •μš© ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄ Bean Object 의 생성과 의쑴 관계..

Programming/Spring 2023.01.21

JPA / Persistence Context / Transactional

Goal JDBC Spring Data JPA Persistence Context JDBC? Spring JDBC λž€ Spring Framework 와 DB κ°„ 톡신을 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ‘œ κ°œλ°œμžκ°€ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” λ²€λ”μ‚¬μ˜ μ œν’ˆμ— 관계없이 DB 접근이 κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€. ν•˜μ§€λ§Œ JDBC λŠ” Persistence Layer 와 κΈ΄λ°€ν•œ 관계λ₯Ό λ§ΊκΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ 직접 Connection μ„€μ •ν•˜κ±°λ‚˜ Statement λ₯Ό μ΄μš©ν•΄ μ›ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ ν›„ Statement λ₯Ό 직접 λ‹«μ•„μ€˜μ•Ό ν•˜λŠ” λ“±μ˜ 문제점이 야기될 수 있으며, 쀑볡 μ½”λ“œμ˜ μž¬μƒμ‚°μœΌλ‘œ 인해 μœ μ§€λ³΄μˆ˜μ˜ λ‚œμ΄λ„κ°€ μƒμŠΉν•˜κ²Œ λœλ‹€. Spring Data JPA ORM(Object Relation Mapper) 쀑 ν•˜λ‚˜λ‘œ, κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€ Java 의 객..

Programming/Spring 2023.01.14

[Effective Java] μ™œ EnumSet κ³Ό EnumMap 을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€

λ“€μ–΄κ°€κΈ° 전에 λ°±κΈ°μ„ λ‹˜μ˜ [Effective Java] κ°•μ˜λ₯Ό μˆ˜κ°•ν•˜λŠ” 쀑 μ—¬λŸ¬ 개의 Enum 객체λ₯Ό κ°€μ§€κ±°λ‚˜ Enum 객체λ₯Ό Key 둜 κ°€μ§€λŠ” 경우 μ™œ EnumMap μ΄λ‚˜ EnumSet 을 μ“°λŠ” 것이 λ‹€λ₯Έ Map / Set κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 νš¨μœ¨μ μΈμ§€μ— λŒ€ν•΄ ν•™μŠ΅ν•˜λŠ” 과제λ₯Ό λ°›μ•˜λ‹€. 이번 μ‹œκ°„μ—λŠ” 이듀이 λ™μž‘ν•˜λŠ” 방식과 그에 λŒ€ν•œ 차이점 및 얻을 수 μžˆλŠ” 이점에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄λ €κ³  ν•œλ‹€. μ™œ μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ? Java 1.5 버전 μ΄μ „μ—λŠ” 자주 μ‚¬μš©ν•˜λŠ” μƒμˆ˜λ₯Ό int νƒ€μž…μœΌλ‘œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν–ˆλ‹€. 이λ₯Ό μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ΄λΌκ³  ν•œλ‹€. 과거의 λ°©μ‹μ²˜λŸΌ int λ₯Ό μ΄μš©ν•΄ μƒμˆ˜λ₯Ό μ—΄κ±°ν•˜λŠ” 경우 λ‹€μŒκ³Ό 같은 문제λ₯Ό μ•ΌκΈ°ν•  수 μžˆλ‹€. 1. 컴파일 νƒ€μž„μ—μ„œ νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•  수 μ—†λ‹€. 2. Name..

Programming/Java 2022.11.20

F019 - Socket

✍️ 이전 μ‹œκ°„μ— IO에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ©΄μ„œ νŒŒμΌμ„ μ €μž₯ν•˜λŠ” 것과 λ„€νŠΈμ›Œν¬ ν†΅μ‹ κ³ΌλŠ” μ „ν˜€ κ΄€λ ¨ μ—†λ‹€κ³  μƒκ°ν–ˆλŠ”λ°, ν•˜λ‚˜ λ‘˜ μ”© κ³΅λΆ€ν•˜λ‹€ λ³΄λ‹ˆ ν•˜λ‚˜μ˜ λΏŒλ¦¬μ—μ„œ μ‹œμž‘λ˜μ—ˆλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆλ‹€. 이번 μ‹œκ°„μ—λŠ” κ·Έ μ—°μž₯으둜 Socket 톡신에 λŒ€ν•΄ 곡뢀해보렀고 ν•œλ‹€. Socket Socket(μ΄ν•˜ μ†ŒμΌ“)은 λ¬΄μ—‡μΌκΉŒ? μΌμƒμ—μ„œ λ³Ό 수 μžˆλŠ” μ½˜μ„ΌνŠΈ μ†ŒμΌ“μΌ μˆ˜λ„ 있고, 전ꡬλ₯Ό λΌμš°λŠ” μ†ŒμΌ“μΌ μˆ˜λ„ 있고, μš°λ¦¬κ°€ μ§€κΈˆ κ³΅λΆ€ν•˜λ €κ³  ν•˜λŠ” μ†ŒμΌ“μ΄λΌλŠ” ν”„λ‘œν† μ½œμΌ μˆ˜λ„ μžˆλ‹€. μ΄λ“€μ˜ 곡톡점은 A와 Bλ₯Ό μ—°κ²°ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ‘΄μž¬λΌλŠ” 것이닀. A socket is an endpoint for communication between two machines. μ†ŒμΌ“μ€ 두 κΈ°κΈ° κ°„μ˜ 톡신을 μœ„ν•œ μ—”λ“œν¬μΈνŠΈμ΄λ‹€. - Java 8 Referenc..

Programming/Java 2021.06.22

F018 - Serializable (직렬화, 역직렬화)

✍️ 업무λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ Domain ν΄λž˜μŠ€μ— Serializable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 경우λ₯Ό 봀던 κ²½ν—˜μ΄ μžˆλŠ”λ°, λ‹Ήμ‹œμ—λŠ” μ™œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”μ§€ 찾아보지 μ•Šκ³  κ°œλ°œν–ˆμ—ˆλ‹€. 이번 μ‹œκ°„μ—λŠ” Serializable μΈν„°νŽ˜μ΄μŠ€λŠ” μ–΄λ–€ μš©λ„λ‘œ μ‚¬μš©ν•˜λŠ”μ§€ κ³΅λΆ€ν•΄λ³΄μž Serializable public class SerializableTest implements Serializable { ... } 사전적 μ˜λ―Έλ‘œλŠ” μ§λ ¬ν™”λΌλŠ” λœ»μ„ 가진닀. μ§λ ¬ν™”λŠ” λ¬΄μ—‡μΌκΉŒ? λͺ¨λž˜μ‹œκ³„ μ•ˆμ— μžˆλŠ” λͺ¨λž˜λ­‰μΉ˜κ°€ 쒁은 ν†΅λ‘œλ₯Ό 톡과 ν•  λ•Œ 각각의 μ•Œκ°±μ΄λ‘œ λ‚˜λ‰˜μ–΄μ Έ μ§€λ‚˜κ°€λŠ” 것을 λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” Serializable κ³Ό λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°λœλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 외뢀와 데이터λ₯Ό μ£Όκ³  λ°›κΈ° μœ„ν•΄μ„œ Stream μ΄μš©ν•˜μ—¬ ν†΅μ‹ ν•˜λŠ”λ°, 이 λ•Œ Str..

Programming/Java 2021.06.16

F017 - Blocking, Non-Blocking / Synchronous, Asynchronous

✍️ μ˜ˆμ „μ— Node.jsλ₯Ό 잠깐 κ³΅λΆ€ν•˜λ©΄μ„œ 기초 지식을 μŒ“λŠ”λ‹€κ³  ν•΄λ‹Ή κ°œλ…μ„ 슀쳐 μ§€λ‚˜κ°€ λ“― μ°Ύμ•„ 봀던 기얡이 μžˆλ‹€. λΈ”λ‘œκ·Έμ— 정리도 ν–ˆλ˜ 것 같은데, λ‹Ήμ‹œμ—λŠ” Thread와 Process 그리고 이둜 인해 μš΄μ˜μ²΄μ œκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ‘°κΈˆλ„ μ•Œμ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— μ „ν˜€ 이해가 μ•ˆλœ μƒνƒœλ‘œ κΈ€λ§Œ μ •λ¦¬ν–ˆμ—ˆλ‹€. (볡뢙 μˆ˜μ€€) 이번 μ‹œκ°„μ—λŠ” κ·Έλž˜λ„ μœ„μ˜ κ°œλ…μ— λŒ€ν•΄ λ―Έμ•½ν•˜κ²Œλ‚˜λ§ˆ 정리가 λ˜μ—ˆμœΌλ‹ˆ 이λ₯Ό 발판으둜 동기와 비동기, Blockingκ³Ό Non-Blocking에 λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μž! Blocking / Non-Blocking Blocking : μ–΄λ– ν•œ ν–‰μœ„μ— μ˜ν•΄ μžμ‹ μ˜ ν–‰μœ„λ₯Ό μ΄μ–΄μ„œ μˆ˜ν–‰ν•˜μ§€ λͺ»ν•˜κ±°λ‚˜ λ§‰νžˆλŠ” 것. Non-Blocking : μ–΄λ– ν•œ ν–‰μœ„μ— ꡬ애 받지 μ•Šκ³  μžμ‹ μ˜ ν–‰μœ„λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것. Sync /..

Programming/Java 2021.06.15

F016 - File, I/O, Stream

✍️ μ‹€λ¬΄μ—μ„œ μ—‘μ…€μ΄λ‚˜ CSV νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜κ±°λ‚˜ μ—…λ‘œλ“œν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆλ˜ κ²½ν—˜μ΄ μžˆλŠ”λ°, μ—‘μ…€μ˜ 경우 Apache μž¬λ‹¨μ—μ„œ μ œκ³΅ν•˜λŠ” 라이브러리λ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν–ˆκ³ , CSV의 경우 ByteArrayInputStream 으둜 κ΅¬ν˜„ν–ˆμ—ˆλ‹€. ν•˜μ§€λ§Œ λ‹Ήμ‹œμ—λŠ” κ·Έλƒ₯ 이 클래슀λ₯Ό μ“°λ©΄ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ/μ—…λ‘œλ“œ ν•  수 μžˆλ‹€λŠ” κ²ƒλ§Œ μ•Œκ³  μ–΄λ–»κ²Œ λ‹€μš΄λ‘œλ“œ/μ—…λ‘œλ“œλ₯Ό ν•  수 μžˆλŠ”μ§€ μ•Œμ§€ λͺ»ν–ˆλ‹€. 이번 μ‹œκ°„μ„ 톡해 I/O, File, I/O Stream 에 λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μž! File java.io νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ” 클래슀둜 파일뿐만 μ•„λ‹ˆλΌ 파일의 κ²½λ‘œκΉŒμ§€ ν¬ν•¨ν•˜λŠ” 포괄적인 ν΄λž˜μŠ€μ΄λ‹€. λ•Œλ¬Έμ— λͺ©μ μ˜ λͺ¨ν˜Έμ„± λ•Œλ¬Έμ— Java 7 λΆ€ν„° NIO2 νŒ¨ν‚€μ§€λ₯Ό μ œκ³΅ν•˜λ©΄μ„œ Files ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λŠ”λ°, μ΄λŠ” File 클래슀 λŒ€λΆ€λΆ„μ˜ λ©”μ†Œ..

Programming/Java 2021.06.14