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

์ „์ฒด ๊ธ€199

[์„ค๊ณ„] Tag ํ…Œ์ด๋ธ” ๋ฆฌํŒฉํ† ๋ง ๋ฐ Tag ๊ฒ€์ƒ‰ ๋ฐฉ์•ˆ ํ˜„์žฌ ์ƒํ™ฉ ์˜ˆ๋น„๋ถ€๋ถ€, ํ”Œ๋ž˜๋„ˆ, ํฌํŠธํด๋ฆฌ์˜ค, ์•„์ดํ…œ์—์„œ ํƒœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ N:M ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋Š” ์ค‘๊ฐ„ํ…Œ์ด๋ธ”์„ ๋‘์–ด ํƒœ๊ทธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์ €๋Š” ์ฃผ์–ด์ง„ ํƒœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ์ง์ ‘ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ถ”๊ฐ€ํ•œ ํƒœ๊ทธ๋กœ๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์  ํ˜„์žฌ MVP ๊ธฐ๋Šฅ ERD๋งŒ ๊ทธ๋ ธ๋Š”๋ฐ๋„ ํ…Œ์ด๋ธ”์ด ๋งŽ์•„์ง€๊ณ , ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ์— ๋”ฐ๋ผ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋„ ๋งŽ์•„์ ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ 1. ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๊ณ , boolean ๊ฐ’์„ ํ†ตํ•ด ํƒœ๊ทธ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌ - table_id (long) - is_customer (bool) - is_planner (bool) - is_porfolio (bool) - is_item (bo.. 2023. 8. 13.
[์˜ค๋ฅ˜] @AuthUser์—์„œ User ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฌธ์ œ ์ƒํ™ฉ UserPrincipal์„ ์ƒ์†๋ฐ›์€ @authUser ์‚ฌ์šฉ ์‹œ ์•„๋ž˜ ์—๋Ÿฌ ๋ฐœ์ƒ EL1008E: Property or field 'users' cannot be found on object of type 'swmaestro.spaceodyssey.weddingmate.domain.oauth2.UserPrincipal' - maybe not public or not valid?" ๋ฐœ์ƒ ์›์ธ UserPrincipal์•ˆ์— User๊ฐ€ ์—†์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” UserPrincipal์—์„œ UserDetails๋ฅผ ๋ฐ›์•„์„œ ๊ตฌํ˜„ํ•œ ์ƒํƒœ์ž„ UserDetailsService์—์„œ Returnํ•˜๋Š” ๊ฐ์ฒด๋Š” UserDetails ํƒ€์ž…์ด์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” User ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ.. 2023. 8. 13.
[์˜ค๋ฅ˜] ์ฟ ํ‚ค ํ•˜์œ„ ๋„๋ฉ”์ธ์ด ๋‹ฌ๋ผ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ๋ฌธ์ œ ์ƒํ™ฉ ํ•˜์œ„ ๋„๋ฉ”์ธ(api.weddingmate.co.kr)์—์„œ ์ƒ์œ„ ๋„๋ฉ”์ธ(weddingmate.co.kr)์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ ResponseCookie.from("refreshToken", refreshToken) .path("/") .domain("weddingmate.co.kr") .maxAge(TimeUnit.MILLISECONDS.toSeconds(refreshTokenValidationTime)) .secure(true) .sameSite("None") .httpOnly(true) .build(); ๋ฐœ์ƒ ์›์ธ Redis์— ์ €์žฅ๋œ refreshToken ๊ฐ’(1)๊ณผ ์ฟ ํ‚ค์— ๋‹ด์•„์„œ ์ „๋‹ฌ๋˜๋Š” refreshToken ๊ฐ’(2)์ด ๋‹ค๋ฆ„ ์ฟ ํ‚ค ์ „๋‹ฌ ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ํŒŒ์•… publi.. 2023. 8. 13.
[์˜ค๋ฅ˜] Transactional์˜ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚˜ dirty checking์ด ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ ์ƒํ™ฉ plannerMapper ์•ˆ์˜ ๋””๋ฒ„๊ทธ๋ฌธ๋“ค์€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๋‚˜ pUsers.updateNickname()์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ ๋˜ํ•œ insert query๊ฐ€ ๋‚˜๊ฐ€๋‚˜ db์— ๋ฐ˜์˜๋˜์ง€ ์•Š์œผ๋ฉฐ, plannerRepository.save()๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ UserService @Transactional public void signupPlanner(Users users, PlannerSignupReqDto reqDto) { Users pUsers = findUserByEmail(users.getEmail()); pUsers.updateNickname(reqDto.getNickname()); Planner planner = plannerMapper.toEntity(pUsers, reqDto); plannerRe.. 2023. 8. 13.
[์ง€์‹] ๋ฉ”์„œ๋“œ ์ฐธ์กฐ์™€ ์ƒ์„ฑ์ž ์ฐธ์กฐ @Transactional(readOnly = true) public void checkUserIsRegistered(Users users) { if (hasPlanner(users)) throw new PlannerDuplicateRegistrationException(); if (hasCustomer(users)) throw new CustomerDuplicateRegistrationException(); } PlannerDuplicateRegistrationException::new์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ๋žŒ๋‹ค์‹์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์˜ ๋ณ€ํ™˜์„ ํ•  ๋•Œ ๋“ฑ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž ์•ž์— ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2023. 7. 28.
[์˜ค๋ฅ˜] ์ƒ์† ๊ด€๊ณ„์˜ Entity์— @Builder ์ ์šฉ ์‹œ ์ด์Šˆ ๋ฌธ์ œ ์ƒํ™ฉ Planner๊ฐ€ User๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๊ณ , ๋‘˜ ๋‹ค์—๊ฒŒ @Builder๋ฅผ ์„ ์–ธํ•œ ์ƒํ™ฉ @SuppressWarnings("checkstyle:RegexpMultiline") @NoArgsConstructor @Getter @Entity public class Users extends BaseTimeEntity { ... @Builder public Users(String email, String nickname, String imageUrl, AuthProvider authProvider, String authProviderId) { this.email = email; this.nickname = nickname; this.imageUrl = imageUrl; this.authProvider = .. 2023. 7. 26.
[AWS S3] ๋ฒ„ํ‚ท ์ƒ์„ฑํ•˜๊ธฐ OAuth2 ์ ์šฉ์ด ๋”œ๋ ˆ์ด ๋ผ์„œ aws ์„ค์ •์ด๋ผ๋„ ํ•˜๊ธฐ... 1. ๋ฒ„ํ‚ท ์ƒ์„ฑํ•˜๊ธฐ ์‚ฌ์šฉ์ž๋“ค์ด ์‚ฌ์ง„ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— public์œผ๋กœ ๋Œ๋ฆฌ๊ธฐ ๋ฒ„ํ‚ท ๋ฒ„์ „ ๊ด€๋ฆฌ๋ž‘ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋Š” ์ผ๋‹จ ๋น„ํ™œ์„ฑํ™”๋กœ ์„ค์ •ํ–ˆ๋‹ค. 1. public access ์„ค์ • ์•„์ง public access๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— policy๋ฅผ ๋งŒ๋“ค์–ด ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋ฒ„ํ‚ท > ๊ถŒํ•œ > ๋ฒ„ํ‚ท ์ •์ฑ… > ์ •์ฑ… ์ƒ์„ฑ๊ธฐ๋กœ ๋“ค์–ด๊ฐ€ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. https://awspolicygen.s3.amazonaws.com/policygen.html - effet : ์ ‘๊ทผํ•˜๋Š” ์‚ฌ๋žŒ์„ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€ - principal : ์ ‘๊ทผํ•˜๋Š” ์‚ฌ๋žŒ ์„ ํƒ - actions : getObject, putObject, deleteObject (์„œ๋น„์Šค์— ๋งž๊ฒŒ ์„ค์ •) - .. 2023. 7. 13.
[Github Hook] Jira ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž๋™ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์ฒ˜์Œ์œผ๋กœ Jira๋ฅผ ์“ฐ๋ฉด์„œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋งค๋ฒˆ ์ด์Šˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ hook์„ ์ด์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์•ž์— ์ง€๋ผ ์ด์Šˆ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™๋„๋ก ์„ค์ •ํ–ˆ๋‹ค! ๋‚ด ์„ค์ • 1. BRANCH NAMING : feature/[SO-์ด์Šˆ๋ฒˆํ˜ธ]-๋ธŒ๋žœ์น˜ ์ƒ์„ธ ์„ค๋ช… ex) feature/SO-26-settings 2. feature ๋ธŒ๋žœ์น˜์—์„œ๋งŒ ์ž‘์—…ํ•  ๋•Œ ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋ถ™๋„๋ก ์„ค์ • main master develop release hotfix์ธ ๊ฒฝ์šฐ pass ์ฒ˜์Œ์—๋Š”... ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜? ์ด์ƒํ•˜๊ฒŒ๋„ ๋Œ์•„๊ฐ€์ง€ ์•Š์•˜๋‹ค https://medium.com/prnd/github-%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%84%B8%EC%A7%80%EC%97%90-jira-%E.. 2023. 6. 29.
0. ํ”„๋กœ์ ํŠธ ์„ธํŒ… ๊ธฐ๋ณธ ์‚ฌํ•ญ - Gradle - Java 17 - Spring Boot 3.1.1 0. ๋ฒ„์ „ ์„ค์ • project : Gradle(Groovy) Language : Java 17 Java 20์ด 5/22์— ๋‚˜์™”์ง€๋งŒ ๋‚˜์˜จ์ง€ ํ•œ ๋‹ฌ ๋œ ๋ฒ„์ „์„ ์“ฐ๋Š” ๊ฑด ์ข€ ์œ„ํ—˜ํ•  ๊ฒƒ ๊ฐ™์•„์„œ 17๋กœ ์„ ํƒํ–ˆ๋‹ค. ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ Collection Factory Method๋ฅผ ๋งŽ์ด ์ผ์—ˆ๋Š”๋ฐ, Java 17์—์„œ๋Š” ์ด ๋ถ€๋ถ„์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ 17๋กœ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค Spring Boot 3.x ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Java 17 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค https://techblog.gccompany.co.kr/%EC%9A%B0%EB%A6%AC%ED%8C%80%EC%9D%B4-jdk-17%EC%9D%84-%EB%8F%84%EC%9E%8.. 2023. 6. 29.