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

๐Ÿ–ฅ๏ธ ๋ฐฑ์—”๋“œ/SpringBoot22

[KakaoPay] ์นด์นด์˜คํŽ˜์ด ๋‹จ๊ฑด ๊ฒฐ์ œ ์ปจํŠธ๋กค๋Ÿฌ ์˜ˆ์‹œ ์•ˆ๋‚ด๊ธ€ ๊ฒฐ์ œ ํ๋ฆ„์„ ๋ณด๊ธฐ ์œ„ํ•ด debug ๋ชจ๋“œ์˜ ๋กœ๊ทธ ์ถœ๋ ฅ์ด ๋งŽ์Šต๋‹ˆ๋‹ค ๊ตฌํ˜„ ์ดˆ๊ธฐ์˜ ์ฝ”๋“œ๋ผ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–‘ํ•ดํ•ด์ฃผ์„ธ์š”! ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•จ ์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ ์ค€๋น„ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ REST ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ @RestController public class KakaoPayController @PostMapping("/api/pay/kakaopay") public ResponseEntity processKakaoPayRequest(@RequestBody OrderInfoDTO orderInfoDTO) @Transactional @PostMapping("/api/pay/kakaopay") public ResponseEntity p.. 2024. 3. 29.
[KakaoPay] ์นด์นด์˜คํŽ˜์ด ๋‹จ๊ฑด ๊ฒฐ์ œ ๊ณผ์ • ์ค‘ ๊ฒช์€ ์˜ค๋ฅ˜ ๋ชจ์Œ ์˜ค๋ฅ˜์˜ ์›์ธ๋“ค (๊ตฌ) ์นด์นด์˜คํŽ˜์ด API ์—์„œ 2024์— ์ƒˆ๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ํ•„์š”์—†์–ด์ง„ ํ•„๋“œ๊ฐ’ ๋•Œ๋ฌธ์— Jackson ๋ชจ๋“ˆ url ์‹ค์ˆ˜ key๊ฐ’์„ dev์šฉ์œผ๋กœ ์•ˆ์จ์„œ ํ•„๋“œ ๋ถˆ์ผ์น˜ ์ธ์ฆ ํ‚ค ๋ณ€๊ฒฝ๋จ (๊ตฌ) headers.set("Authorization", "KakaoAK " + kakaoPayConfig.getSecretKeyDev()); (์‹ ) headers.set("Authorization", "SECRET_KEY " + kakaoPayConfig.getSecretKeyDev()); ์นด์นด์˜ค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒฐ์ œ ์˜ค๋ฅ˜์ฝ”๋“œ ์ •๋ฆฌ ์—‘์…€ํŒŒ์ผ ๋‚ด๊ฐ€ ๊ฒช์€ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ ์ •๋ฆฌ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ Create breakpoint ์›์ธ (์ถ”์ธก) ํ•ด๊ฒฐ๋ฐฉ๋ฒ• org.springframework.web.client.HttpClientErrorExc.. 2024. 3. 29.
[KakaoPay] ์นด์นด์˜คํŽ˜์ด ๋‹จ๊ฑด ๊ฒฐ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• (2024 ์‹ ๊ทœ API ๋ฒ„์ „) ์‚ฌ์ „์ค€๋น„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก https://developers.kakaopay.com/applications ์นด์นด์˜คํŽ˜์ด | ๊ฐœ๋ฐœ์ž์„ผํ„ฐ ์ƒˆ๋กœ์šด ๊ธฐํšŒ์™€ ๊ฐ€์น˜๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๋ด์š” developers.kakaopay.com ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ๊ด€๋ จ ๋ฌธ์˜ ํฌ๋Ÿผ https://developers.kakaopay.com/forum/ ํฌ๋Ÿผ ์นด์นด์˜คํŽ˜์ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ ์ด์šฉ ๊ด€๋ จ ์งˆ๋ฌธ ๋ฐ ๋‹ต๋ณ€์„ ๊ณต์œ ํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. developers.kakaopay.com 2024 ์นด์นด์˜คํŽ˜์ด API ์ธ์ฆ์‹œ ์‚ฌ์šฉํ•  ๊ฐ’ ์ธ์ฆ ์Šคํ‚ค๋งˆ (๊ตฌ) "KakaoAK " -> (์‹ ) " SECRET_KEY " Secret Key๊ฐ’์€ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ Secret Key(dev) ์‚ฌ์šฉํ•˜๊ธฐ ์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ ๊ตฌํ˜„ ๊ณผ์ • OrderInfoDTO : ์‚ฌ์šฉ์ž ์ฃผ๋ฌธ ์ •๋ณด Kakao.. 2024. 3. 29.
[์ธ์ฆ๋ฒˆํ˜ธ] sms ๋ฌธ์ž ๋ฐœ์†ก ๊ตฌํ˜„ - ์ฟจ์—์Šค์— ์—์Šค (2024) ์ผ๊ฒฝํ—˜ ๋งˆ์ง€๋ง‰ API ๊ณผ์ œ ์ค‘ ํ•˜๋‚˜์˜€๋˜ ๋ฌธ์ž๋กœ ํšŒ์›๊ฐ€์ž… ์ธ์ฆ๋ฒˆํ˜ธ ๋ฐœ์†กํ•˜๊ธฐ ์—ฌ๋Ÿฌ ๋ฌธ์ž๋ฉ”์„ธ์ง€ ๋ฐœ์†ก ์‚ฌ์ดํŠธ์ค‘์— ๋ฌด๋ฃŒ 300ํฌ์ธํŠธ๋ฅผ ์ฃผ๋Š” ์ฟจ์—์Šค์— ์—์Šค๋ฅผ ์„ ํƒํ•จ https://coolsms.co.kr/ ๊ตฌ๊ธ€๋ง์œผ๋กœ ์ฐพ์€ ์ฝ”๋“œ๋“ค์€ ํ˜„์žฌ ์ฟจ์—์Šค์— ์—์Šค์—์„œ ์˜ฌ๋ฆฐ ๊นƒ ์ฝ”๋“œ์™€ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์„œ ์ฟจ์—์Šค์— ์—์Šค์˜ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•œ ์ฝ”๋“œ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•จ ์ฟจ์—์Šค์— ์—์Šค ํšŒ์›๊ฐ€์ž… ๋ฐ ๋ณธ์ธ์ธ์ฆ ํ•˜๊ธฐ ๋ณธ์ธ์ธ์ฆ์‹œ 300ํฌ์ธํŠธ ๋ฌด๋ฃŒ ์ฆ์ • ์นด์นด์˜คํ†ก ์•Œ๋ฆผ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•จ API Key์™€ API ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธํ•˜๊ธฐ ๋Œ€์‹œ๋ณด๋“œ - ๊ฐœ๋ฐœ ํƒญ์—์„œ SDK ์™€ git repository ํ™•์ธํ•˜๊ธฐ net.nurigo sdk 4.3.0 ์Šคํ”„๋ง ์ฝ”๋“œ private final DefaultMessageService messageService; /** * ๋‹จ์ผ ๋ฉ”์‹œ์ง€ ๋ฐœ.. 2024. 2. 29.
[Querydsl] ๋™์ ์ฟผ๋ฆฌ - Where์—์„œ ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ ๋™์ ์ฟผ๋ฆฌ - Where์—์„œ ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ ์กฐ๋ฆฝ์„ ํ•  ์ˆ˜ ์žˆ์Œ, ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์—์„œ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•จ ์ฟผ๋ฆฌ ์ž์ฒด์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง null ์ฒดํฌ๋Š” ์ฃผ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•จ @Test public void ๋™์ ์ฟผ๋ฆฌ_WhereParam() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember2(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List searchMember2(String usernameCond, Integer ageCond) { return queryFacto.. 2024. 1. 8.
[Querydsl] SpringDataJPA + Querydsl + ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); } SpringDataJPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ ์™ธ์— ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ public class MemberRepositoryImpl implements MemberRepositoryCustom { private final JPAQueryFactory queryFactory; public MemberRepositoryImpl(EntityManager em) { this.queryFactory = new JPAQueryFactory(em); } @Override //ํšŒ์›๋ช…, ํŒ€๋ช…, ๋‚˜์ด(ag.. 2024. 1. 7.
[Querydsl] DTO ์กฐํšŒ ๋ฐฉ๋ฒ• ์ˆœ์ˆ˜ JPA์—์„œ DTO ์กฐํšŒ List result = em.createQuery( "select new study.querydsl.dto.MemberDto(m.username, m.age) " + "from Member m", MemberDto.class) .getResultList(); new ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ DTO์˜ package์ด๋ฆ„์„ ๋‹ค ์ ์–ด์ค˜์•ผํ•จ ์ƒ์„ฑ์ž ๋ฐฉ์‹๋งŒ ์ง€์›ํ•จ Querydsl ๋นˆ ์ƒ์„ฑ(Bean population) ๊ฒฐ๊ณผ๋ฅผ DTO ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•จ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง€์›ํ•จ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ ์ƒ์„ฑ์ž ์‚ฌ์šฉ [ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ - Setter] List result = queryFactory .select(Projections.bean(MemberDto.class, member.user.. 2024. 1. 7.