์ค๋ ์งํํ ๋ด์ฉ๋ค ๐ง
ํ์ด์ง ์กฐํ ํํฐ๋ง ๋ก์ง ์๋ฒฝํ๊ฒ ๊ตฌํ
QueryDSL์ ํ์ฉํ์ฌ ์ต์
๋ค์ ํํฐ๋งํด์ ์ํ๋ ๋ฐ์ดํฐ๋ง ๋ฐํ๋ฐ์ ์ ์๋๋ก ํ๋ ๋ก์ง์ ์์ฑํ๋ค.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ Dto๋ก ๋ฐํ๋ฐ๋ ๊ฑด ํ๋ค ๊ฒ ๊ฐ์์ ๋ก์ง์ ๋๋ ์ dataId๋ฅผ ๋ฐํ๋ฐ๊ณ keyword๋ฅผ ๋ฐ๋ก ๋ฐํ๋ฐ์์ List ํํ๋ก Dto์ ํฉ์ณ์ง ์ ์๊ฒ ๋ก์ง์ ๊ตฌํํ๋ค.
์ ๋ถ ๊ตฌํํ ํ Postman์ ํตํด ํ
์คํธ๋ฅผ ํด๋ดค๋๋ฐ ์ด๋ค ํํฐ๋ง์ ๋ฃ์ด๋ ์ ์์ ์ผ๋ก ์คํ๋์ง ์๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋์๋ค.. @ModelAttribute๋ฅผ ์ฌ์ฉํด์ ์
๋ ฅ์ ๋ฐ๊ฒ๋ ์ค์ ํ๋๋ฐ ์ด ์ด๋
ธํ
์ด์
์ ํ์ฉํ๋ ค๋ฉด Dto์ @Setter ์ด๋
ธํ
์ด์
์ด ๋ถ์ด์ผ ํ๋ ๊ฒ์ด์๋ค........ ๊ทธ๋ฐ ์ค๋ ๋ชจ๋ฅด๊ณ ๋ด๊ฐ ์ง ์ฝ๋๋ Postman์์ ์
๋ ฅ์ ์๋ชปํ ์ค ์๊ณ ๊ณ์ ๊ฑฐ๊ธฐ๋ง ๋ค์ฌ๋ค ๋ณด๊ณ ์์์ผ๋... ๋ต์ด ๋์ฌ๋ฆฌ๊ฐ ์์๋ค.
๋ฐฉ๋ฒ์ ์ฐพ์ ํ @Setter๋ฅผ ์ ์ฉํ๊ณ ๋ค์ ํ
์คํธ๋ฅผ ๋๋ ค๋ดค๋๋ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฒ์์ด๊ฐ ์ ์ฅ๋ ์ ์๋๋ก ์ฝ๋ ์์
ํํฐ๋ง ๊ธฐ๋ฅ์ ๋๋ธ ํ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฒ์์ด๋ฅผ ํตํด ํ์ฌ๋ช
๊ณผ ๋น๊ตํด์ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋๋ก ํ๋ ๋ก์ง์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ค.
Dto์ ์ฌ์ฉ์๊ฐ ๊ฒ์์ด๋ฅผ ์
๋ ฅํ ์ ์๋ ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ QueryDSL์์๋ ๊ฒ์์ด๋ฅผ ํตํด ํ์ฌ๋ช
์ ํฌํจ๋๋ ๋จ์ด๊ฐ ์๋ค๋ฉด ์ถ๋ ฅ๋ ์ ์๋๋ก ํ๋ค.
ํ์ง๋ง ์ด๋ฒ์๋ ํ
์คํธํ์ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.. ์ ์๋ฌ๊ฐ ๋๋๊ฑด๊ฐ.. ํ๋ฉด์ ์ด์ ๋ฅผ ์ฐพ๊ณ ์์๋๋ฐ ๋คํํ ๋ด๊ฐ @RequestMapping์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ Postman์์ ๋ฐ๊พธ์ง ์์์ ์๊ธฐ๋ ์๋ฌ์๊ณ , URL์ ์์ ํ ํ ๊ธฐ๋ฅ์ ํ
์คํธํ๋๋ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
Stream ๊ณต๋ถ
์ด๋ฒ ํ๋ก์ ํธ๋ ๊ทธ๋ ๊ณ ๋ค๋ฅธ ํ๋ก์ ํธ๋ ์งํํ๋ฉด์ Stream์ ๊ต์ฅํ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ์ ์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ์ง ์๊ณ ๊ทธ๋ฅ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ฐ๋ผ ์ ๋๊ฒ ๋๋ถ๋ถ์ด์๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ ์ดํดํ๊ณ ๋์ด๊ฐ์๋ ์๊ฐ์ผ๋ก ๊ฐ๋ ๋ค๊ณผ ๊ด๋ จ ํจ์๋ค์ ์ ๋ฆฌํด๋ดค๋ค.
Java Stream
๋๋ค๋ฅผ ํ์ฉํด ๋ฐฐ์ด๊ณผ ์ปฌ๋ ์
์ ํจ์ํ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ์ .
๋ฐ์ดํฐ ์์ค๋ฅผ ์ถ์ํํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ฅผ ์ ์ํด ๋์์ ๋ฐ์ดํฐ ์์ค์ ์๊ด์์ด ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์์ผ๋ฏ๋ก ์ฝ๋์ ์ฌ์์ฉ์ฑ์ด ๋์์ง.
์คํธ๋ฆผ์ ํน์ง
- ์๋ณธ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์ → ์ฝ๊ธฐ๋ง ํจ
- ์ผํ์ฉ → ํ๋ฒ ์ฌ์ฉํ๋ฉด ๋ซํ์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
- ์ต์ข ์ฐ์ฐ ์ ๊น์ง ์ค๊ฐ ์ฐ์ฐ์ ์ํํ์ง ์์
- ์์ ์ ๋ด๋ถ ๋ฐ๋ณต์ผ๋ก ์ฒ๋ฆฌ → forEach()๋ ๋งค๊ฐ๋ณ์์ ๋์ ๋ ๋๋ค์์ ๋ฐ์ดํฐ ์์ค์ ๋ชจ๋ ์์์ ์ ์ฉ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ฌ์ → ๋ฉํฐ์ฐ๋ ๋ ์ฌ์ฉ
- ๊ธฐ๋ณธํ ์คํธ๋ฆผ์ ์ ๊ณต → Stream<Integer> ๋์ IntStream์ด ์ ๊ณต๋์ด์ ์คํ ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ ๋ฑ์ ๋ถํ์ํ ๊ณผ์ ์ด ์๋ต๋๊ณ ์ซ์์ ๊ฒฝ์ฐ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์ ๊ณต(.sum(), .average() ๋ฑ)
์ค๊ฐ ์ฐ์ฐ (๊ฐ๊ณต)
Filtering
์คํธ๋ฆผ ๋ด ์์๋ค์ ํ๋์ฉ ํ๊ฐํด์ ๊ฑธ๋ฌ๋ด๋ ์์ → if๋ฌธ ์ญํ
List<String> list = Arrays.asList("a","b","c");
Stream<String> stream = list.stream()
.filter(list -> list.contains("a")); // 'a'๊ฐ ๋ค์ด๊ฐ ์์๋ง ์ ํ [a]
๋๋ค์์ ๋ฆฌํด๊ฐ์ boolean์ด๊ณ true์ธ ๊ฒฝ์ฐ๋ง ๋ค์ ๋จ๊ณ ์งํ.
Mapping
์คํธ๋ฆผ ๋ด ์์๋ค์ ํ๋์ฉ ํน์ ๊ฐ์ผ๋ก ๋ณํํ๋ ์์ , ๊ฐ์ ๋ณํํ๊ธฐ ์ํ ๋๋ค๋ฅผ ์ธ์๋ก ๋ฐ์
์คํธ๋ฆผ์ ์ํ๋ ๋ชจ์์ ์๋ก์ด ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
Stream<String> stream = list.stream()
.map(String::toUpperCase); //[A,B,C]
.map(Integers::parseInt); // ๋ฌธ์์ด -> ์ ์๋ก ๋ณํ
์คํธ๋ฆผ์ ์๋ ๊ฐ์ ์ํ๋ ๋ฉ์๋์ ์ ๋ ฅ๊ฐ์ผ๋ก ๋ฃ์ผ๋ฉด ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ(๋ฐํ๊ฐ)์ด ๋ด๊น.
Sorting
์คํธ๋ฆผ ๋ด ์์๋ค์ ์ ๋ ฌํ๋ ์์ , Comparator ์ฌ์ฉ
Stream<String> stream = list.stream()
.sorted() // [a,b,c] ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
.sorted(Comparator.reverseOrder()) // [c,b,a] (๋ด๋ฆผ์ฐจ์)
List<String> list = Arrays.asList("a","bb","ccc");
Stream<String> stream = list.stream()
.sorted(Comparator.comparingInt(String::length)) // [ccc,bb,a] //๋ฌธ์์ด ๊ธธ์ด ๊ธฐ์ค ์ ๋ ฌ
๊ธฐํ ์ฐ์ฐ
Stream<String> stream = list.stream()
.distinct() // ์ค๋ณต ์ ๊ฑฐ
.limit(max) // ์ต๋ ํฌ๊ธฐ ์ ํ
.skip(n) // ์์์๋ถํฐ n๊ฐ skipํ๊ธฐ
.peek(System.out::println) // ์ค๊ฐ ์์
๊ฒฐ๊ณผ ํ์ธ
์ต์ข ์ฐ์ฐ (๊ฒฐ๊ณผ ๋ง๋ค๊ธฐ)
Calculating
๊ธฐ๋ณธํ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์คํธ๋ฆผ ๋ด ์์๋ค๋ก ์ต์, ์ต๋, ํฉ, ํ๊ท ๋ฑ์ ๊ตฌํ๋ ์ฐ์ฐ์ ์ํํ ์ ์์
IntStream stream = list.stream()
.count() //์คํธ๋ฆผ ์์ ๊ฐ์ ๋ฐํ
.sum() //์คํธ๋ฆผ ์์์ ํฉ ๋ฐํ
.min() //์คํธ๋ฆผ์ ์ต์๊ฐ ๋ฐํ
.max() //์คํธ๋ฆผ์ ์ต๋๊ฐ ๋ฐํ
.average() //์คํธ๋ฆผ์ ํ๊ท ๊ฐ ๋ฐํ
Reduction
์คํธ๋ฆผ์ ์์๋ฅผ ํ๋์ฉ ์ค์ฌ๊ฐ๋ฉฐ ๋์ ์ฐ์ฐ์ ์ํ
IntStream stream = IntStream.range(1,5);
.reduce(10, (total,num)->total+num); //reduce(์ด๊ธฐ๊ฐ, (๋์ ๋ณ์,์์)->์ํ๋ฌธ)
// 10 + 1+2+3+4+5 = 25
Collecting
//์์ ๋ฆฌ์คํธ
List<Person> members = Arrays.asList(new Person("lee", 26),
new Person("kim", 23),
new Person("park", 23));
// toList() - ๋ฆฌ์คํธ๋ก ๋ฐํ
members.stream()
.map(Person::getLastName)
.collect(Collectors.toList()); // [lee, kim, park]
// joining() - ์์
๊ฒฐ๊ณผ๋ฅผ ํ๋์ ์คํธ๋ง์ผ๋ก ์ด์ด ๋ถ์ด๊ธฐ
members.stream()
.map(Person::getLastName)
.collect(Collectors.joining(delimiter = "+" , prefix = "<", suffix = ">"); // <lee+kim+park>
//groupingBy() - ๊ทธ๋ฃน์ง์ด์ Map์ผ๋ก ๋ฐํ
members.stream()
.collect(Collectors.groupingBy(Person::getAge)); // {26 = [Person{lastName="lee",age=26}],
// 23 = [Person{lastName="kim",age=23},Person{lastName="park",age=23}]}
//collectingAndThen() - collecting ์ดํ ์ถ๊ฐ ์์
์ํ
members.stream()
.collect(Collectors.collectingAndThen (Collectors.toSet(),
Collections::unmodifiableSet));
//Set์ผ๋ก collectํ ํ ์์ ๋ถ๊ฐํ set์ผ๋ก ๋ณํํ๋ ์์
์คํ
Matching
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๊ฐ ์๋์ง ์ฒดํฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
- anyMatch(ํ๋๋ผ๋ ๋ง์กฑํ๋ ์์๊ฐ ์๋์ง)
- allMatch(๋ชจ๋ ๋ง์กฑํ๋์ง)
- noneMatch(๋ชจ๋ ๋ง์กฑํ์ง ์๋์ง)
List<String> members = Arrays.asList("Lee", "Park", "Hwang");
boolean matchResult = members.stream()
.anyMatch(members -> members.contains("w")); //w๋ฅผ ํฌํจํ๋ ์์๊ฐ ์๋์ง, True
boolean matchResult = members.stream()
.allMatch(members -> members.length() >= 4); //๋ชจ๋ ์์์ ๊ธธ์ด๊ฐ 4 ์ด์์ธ์ง, False
boolean matchResult = members.stream()
.noneMatch(members -> members.endsWith("t")); //t๋ก ๋๋๋ ์์๊ฐ ํ๋๋ ์๋์ง, True
Iterating
forEach๋ก ์คํธ๋ฆผ์ ๋๋ฉด์ ์คํ๋๋ ์์
members.stream()
.map(Person::getName)
.forEach(System.out::println);
// ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ (peek๋ ์ค๊ฐ, forEach๋ ์ต์ข
)
Finding
์คํธ๋ฆผ์์ ํ๋์ ์์๋ฅผ ๋ฐํ
Person person = members.stream()
.findAny() // ๋จผ์ ์ฐพ์ ์์ ํ๋ ๋ฐํ, ๋ณ๋ ฌ ์คํธ๋ฆผ์ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ์์๊ฐ ๋ณด์ฅ๋์ง ์์
.findFirst() // ์ฒซ๋ฒ์งธ ์์ ๋ฐํ
์ต๊ทผ ๊ฒ์ ๊ธฐ๋ก ์กฐํ ๊ธฐ๋ฅ ๊ตฌํ
ํ์ด์ง ์กฐํ๊ฐ ๋ง๋ฌด๋ฆฌ๋๊ณ ์ต๊ทผ ๊ฒ์ ๊ธฐ๋ก์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ๊ทธ ์ ์ ๋ฏธ๋ฆฌ ์ง๋์ ์ฝ๋๊ฐ ์์ด์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์๋ค.
์๊ฐ๋ณด๋ค ์๊ฐ์ด ๋ ๋จ์ถ๋์๊ณ ๊ธ๋ฐฉ ๋ง๋ฌด๋ฆฌํ ์ ์์๋ค. ๊ทธ๋์ ๊ธฐ๋ฅ ๊ตฌํ์ ๋ง๋ฌด๋ฆฌํ ํ Elasticsearch์ ๋ํด ๊ณต๋ถ๋ฅผ ์์ํ ์ ์์๋ค.
์ค๋ ํ๋ฃจ ์ ๋ฆฌ โ๏ธ
์ค๋์ ์ ๋ง ๋ชฝ๋กฑํ๊ฒ ํ๋ฃจ๊ฐ ์ง๋๊ฐ ๊ฒ ๊ฐ๋ค... ํ๋ฃจ์ 4์๊ฐ ์๊ณ ๋ฒํฐ๋ ๊ฒ์ ์ ๋ง ๋ฏธ์น ์ง ๊ฐ๋ค. ์๋ฒฝ 3์ ๋ฐ์ ์์ 7์ ๋ฐ์ ์ผ์ด๋ ๊ฒ๋ ๋๋จํ ์ผ์ด๋ค.. ๋ ์ง์ง ์ ์ด ํ์์ธ ์ฌ๋์ธ๋ฐ ใ
ใ
ํ๋ก์ ํธ ๊ธฐ๊ฐ๋์์ ์ ์ ํฌ๊ธฐํด์ผ๊ฒ ์ง..
์ด๋ป๊ฒ๋ ๋ฒํฐ๋ฉด์ ์ง๊ธ๋ ๊ธ์ ์์ฑํ๊ณ ์์ง๋ง ๋์ ๋ฐ์ฏค ๊ฐ๊ธด ์ํ์ด๋ค. ์ค๋์ ๊ทธ๋๋ ์ข ์๊ณ ๋ด์ผ ์ปจ๋์
ํ๋ณตํด์ ํ ํ์๋ ๊ฐ๋
๊ณต๋ถ๋ฅผ ์ง์คํด์ ํ ์ ์๋๋ก ํด์ผ๊ฒ ๋ค.
๋ด์ผ ๊ณํ โฐ
- Elasticsearch ๊ณต๋ถ
- Elasticsearch ์ค์น..?
+ ์ถ๊ฐ ๊ณํ์ ์ธ์ ๋ ์ง ์๊ธธ ์ ์์ต๋๋ค~~
'โ๏ธ Today I Learned(TIL) > ์คํ๋ฅดํ ๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ TIL ] ์ต์ข ํ๋ก์ ํธ_Day 9 (0) | 2025.02.19 |
---|---|
[ TIL ] ์ต์ข ํ๋ก์ ํธ_Day 8 (0) | 2025.02.18 |
[ TIL ] ์ต์ข ํ๋ก์ ํธ_Day 2 (0) | 2025.02.11 |
[ TIL ] ์ต์ข ํ๋ก์ ํธ_Day 1 (0) | 2025.02.10 |
[ TIL ] ํ๋ฌ์ค ํ๋ก์ ํธ_Day 6 (0) | 2025.02.05 |