๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Tech Stack/Java & Spring8

[Java] optional์˜ orElse์™€ orElseGet ์ฐจ์ด - orElse๋Š” Null์ด๋˜ ๋ง๋˜ ํ•ญ์ƒ ์‚ฌ์šฉ- orElseGet์€ null์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ public interface MemberRepository extends JpaRepository { Optional findByKakaoId(String kakaoId);} 2025. 9. 4.
[Spring] [์นด์นด์˜ค ๋กœ๊ทธ์ธ] RestTemplate vs WebClient Spring์—์„œ ์™ธ๋ถ€ API์™€ ํ†ต์‹ ํ•  ๋•Œ๋Š” RestTemplate ๋˜๋Š” WebClient๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ๋Š” RestTemplate์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๊ธฐ์กด์— WebClient๋ฅผ ์‚ฌ์šฉํ•ด ์™”๊ณ  ์ฐจ์ด๊ฐ€ ๊ถ๊ธˆํ•ด ์ •๋ฆฌํ•ด ๋ดค๋‹ค. RestTemplate vs WebClient ์ฐจ์ด๊ตฌ๋ถ„RestTemplateWebClient๋ฐฉ์‹๋™๊ธฐ(๋ธ”๋กœํ‚น)– ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ์‘๋‹ต๊นŒ์ง€ ๋Œ€๊ธฐ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น– ๋ณด๋‚ด๋‘๊ณ  ์‘๋‹ต ์˜ค๋ฉด ์ฒ˜๋ฆฌ(Mono/Flux)์ „์†ก/ํŒŒ์‹ฑHttpMessageConverter ๋“ฑ๋ก์š”์ฒญ ์‹œ์ ์— contentType/ํ—ค๋” ๋ช…์‹œ, BodyInserters ๋“ฑ์œผ๋กœ ๋ช…ํ™•ํ™•์žฅ์„ฑํƒ€์ž„์•„์›ƒ/์—ฐ๊ฒฐ ํ’€ ์ˆ˜๋™ ์„ค์ •Reactor Netty๋กœ ๋„คํŠธ์›Œํฌ ์˜ต์…˜ ์ œ์–ด ์‰ฌ์›€ ์นด์นด์˜ค OAuth์— ์ ์šฉํ•  ๋•Œ ํ™•์ธํ•  ์‚ฌํ•ญ-.. 2025. 9. 3.
[Spring] ์ค‘์ฒฉ ํด๋ž˜์Šค์™€ DTO ์„ค๊ณ„ KakaoDTO.OAuthToken oAuthToken = kakaoUtil.requestToken(accessCode); KakaoDTO.OAuthToken- KakaoDTO ํด๋ž˜์Šค ์•ˆ์— ์žˆ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค(Static Inner Class) ๋˜๋Š” ์ค‘์ฒฉ ํด๋ž˜์Šค OAuthToken์„ ์˜๋ฏธํ•œ๋‹ค.- KakaoDTO ๋ผ๋Š” DTO ๋ฌถ์Œ ์•ˆ์—์„œ "์นด์นด์˜ค์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด" ๋ฅผ ๋งํ•œ๋‹ค. // ์ฝ”๋“œ ์˜ˆ์‹œpublic class KakaoDTO { @Getter public static class OAuthToken{ @JsonProperty("token_type") private String tokenType; @JsonProperty("access_to.. 2025. 9. 3.
[์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ] Set 1. Set์ด๋ž€?์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž๋ฐ”์—์„œ๋Š” Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด ์ œ๊ณต2. ์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ Set ๊ตฌํ˜„์ฒด๋”๋ณด๊ธฐโ˜‘๏ธŽ HashSet ์„ค๋ช…ํŠน์ง•์„ค๋ช…๊ตฌํ˜„๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ์ˆœ์„œ๋ณด์žฅํ•˜์ง€ ์•Š์Œ(์ž…๋ ฅ ์ˆœ์„œ X)์„ฑ๋Šฅํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„ O(1)์šฉ๋„์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋”๋ณด๊ธฐโ˜‘๏ธŽ LinkedHashSet ์„ค๋ช…ํŠน์ง•์„ค๋ช…๊ตฌํ˜„HashSet + ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ์ˆœ์„œ์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€์„ฑ๋ŠฅHashSet๋ณด๋‹ค๋Š” ์•ฝ๊ฐ„ ๋А๋ฆฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋น ๋ฆ„์šฉ๋„์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋”๋ณด๊ธฐโ˜‘๏ธŽ TreeSet ์„ค๋ช…ํŠน์ง•์„ค๋ช…๊ตฌํ˜„๋‚ด๋ถ€์ ์œผ๋กœ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ์ผ์ข…) ์‚ฌ์šฉ์ˆœ์„œ์ž๋™ ์ •๋ ฌ๋จ (๊ธฐ๋ณธ์€ ์˜ค๋ฆ„์ฐจ์ˆœ, Comparator๋กœ ์ปค์Šคํ…€ ๊ฐ€.. 2025. 4. 10.
[์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ] HashSet 1. Set์ด๋ž€?โ˜‘๏ธŽ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐโ˜‘๏ธŽ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด: HashSet, LinkedHashSet, TreeSet2. Set์˜ ๊ธฐ๋ณธ ๋™์ž‘โ˜‘๏ธŽ add(value) : ์ค‘๋ณต์ด๋ฉด ์ €์žฅํ•˜์ง€ ์•Š์Œโ˜‘๏ธŽ contains(value) : ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธโ˜‘๏ธŽ remove(value) : ๋ฐ์ดํ„ฐ ์‚ญ์ œโ˜น๏ธŽ ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ Set ๊ตฌํ˜„์ฒด๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ผ์ด ๋น„๊ต → ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)3. HashSet์ด๋ž€?โ˜‘๏ธŽ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐโ˜‘๏ธŽ hashCode()์™€ equals()๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จโ˜‘๏ธŽ ํƒ์ƒ‰ ์†๋„ ๋น ๋ฆ„ (ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„ O(1))4. ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” Set - MyHashSetV1 (์ •์ˆ˜ํ˜• ์ „์šฉ)๋”๋ณด๊ธฐpublic class MyHashS.. 2025. 4. 9.
[์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ] ํ•ด์‹œ(Hash) ์ž๋ฐ” ์ž๋ฃŒ๊ตฌ์กฐ- ํ•ด์‹œ(Hash) : ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์กฐํšŒ์™€ ์ค‘๋ณต ๋ฐฉ์ง€ ๊ฐ€๋Šฅ! 1. ๋ฆฌ์ŠคํŠธ vs ์…‹(Set)๊ตฌ์กฐ์ˆœ์„œ์ค‘๋ณตํŠน์ง•ListOO์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜, ์ˆœ์„œ ์œ ์ง€SetXX์ค‘๋ณต ์ œ๊ฑฐ, ๋น ๋ฅธ ํƒ์ƒ‰ ๋”๋ณด๊ธฐList cart = List.of("apple", "apple", "banana");Set ids = Set.of("user1", "user2"); // "user1" ์ค‘๋ณต ์ถ”๊ฐ€ ๋ถˆ๊ฐ€2. Set ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์‹œโ˜‘๏ธŽ O(n)์˜ ์„ ํ˜• ํƒ์ƒ‰ -> ์ค‘๋ณต์€ ์ž˜ ๋ง‰์ง€๋งŒ ๋А๋ฆฌ๋‹ค." data-text-less="๋‹ซ๊ธฐ">๋”๋ณด๊ธฐ// ๋‚ด๋ถ€ ๋ฐฐ์—ด: ๊ณ ์ • ํฌ๊ธฐ 10private int[] elementData = new int[10];private int size = 0;// ์ค‘๋ณต ์—†์ด ๊ฐ’ ์ถ”๊ฐ€public boolean add(int val.. 2025. 4. 6.