가장 중요한 건 계속 질문에만 머물러 있기 보다는 자신이 할 수 있는 일을 일단 시작하고 거기서부터 꾸준히 자신을 한계로 밀어붙이는 것입니다. 무엇이든 해 보아야 방향이 보이는 법입니다. '어디가 좋은 길일까?'라는 질문에 너무 오래 사로 잡혀있는 건 좋지 않습니다. 오늘 바로 Armeria나 Central Dogma에 보낼 PR을 준비해 보시면 어떨까요? :)
오늘의 목표
•
카카오 로그인 딥다이브
•
AOP 딥다이브
목표에 따른 To-Do
•
일일 코테 두 문제
•
일일 코테 스터디
•
카카오 로그인
◦
RestTemplate을 사용하여 어떻게 POST를 보내는가
◦
인증 시, 어떤 시퀀스로 어떤 값을 요청하여 어떻게 핸들링하는가?
•
AOP
◦
왜 쓰는가?
◦
무슨 개념인가??
◦
호따뚜따 실제 코딩 고고고!! >>>> 개념&방법론 공부
•
이전 프로젝트 진행하며 쌓아왔던 궁금했던 것들 질문하기
1.
토끼책 질문
a.
한 사람이 동시에 여러 역할을 수행할 수 있다 : 캐시어와 바리스타라는 개별적인 역할을 이용해 협력 관계를 묘사했지만 한 사람이 캐시어와 바리스타의 역할을 동시에 수행하는 것도 가능하다.
https://incheol-jung.gitbook.io/docs/study/readme-1/1
2.
양방향 연관관계 편의메서드를 요구사항에 다른 요청에 따라 한 쪽 도메인에서 update,remove를 정의해주었다. 이렇게 하는 게 맞나??
@Entity
public class Post extends TimeStamp {
@ManyToOne(fetch = FetchType.LAZY)
@Setter(AccessLevel.NONE)
@JoinColumn(name = "user_id")
User user;
}
Java
복사
@Entity
@NoArgsConstructor
public class User extends TimeStamp {
@OneToMany(targetEntity = Post.class, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private final List<Post> posts = new ArrayList<>();
}
Java
복사
/**
* Post와 1대다 관계의 User를 입력받아 연관관계 해결
*
* @param user 로그인 된 User
*/
public void setAuthor(User user) {
// 기존 연관된 User 제거
if (this.user != null) {
this.user.getPosts().remove(this);
}
// User 추가 후, User에서의 posts에 본인 추가
this.user = user;
user.getPosts().add(this);
}
Java
복사
3.
Test 코드 시, yml 은 어떻게 보호하나??
a.
@ActiveProfiles("test")로 변경해주고 있긴 한데, 혹시 환경변수 설정은 못 하나요??
application-test.yml을 따로 나눠서 분리!!
⇒ 공부공부고웁!!
spring:
profiles:
default: local
# DATABASE
datasource:
url: ${DB_URL}
driverClassName: com.mysql.cj.jdbc.Driver
username: ${DB_USER}
password: ${DB_PASSWORD}
# JPA
jpa:
properties:
hibernate:
# INIT
ddl-auto: create-drop
# DEV
# ddl-auto: update # Only 'create' when init
show_sql: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
generate-ddl: true
# JWT
jwt:
secret:
key:
${JWT_KEY}
---
spring:
config:
activate:
on-profile: test
# DATABASE
datasource:
url: jdbc:mysql://localhost:3306/hobby_bungae?serverTimezone=UTC&characterEncoding=UTF-8
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 1026baby
# JPA
jpa:
properties:
hibernate:
# INIT
ddl-auto: create-drop
# DEV
# ddl-auto: update # Only 'create' when init
show_sql: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
generate-ddl: true
# JWT
#jwt:
# secret:
# key:
# 7Iqk7YyM66W07YOA7L2U65Sp7YG065+9U3ByaW5n6rCV7J2Y7Yqc7YSw7LWc7JuQ67mI7J6F64uI64ukLg==
Java
복사
4.
단방향 연관관계에서는 역참조를 할 수가 없다. 그럼 어떻게 상대방 엔티티를 찾아오는가??
remove(User user){
List<Post> posts = postRepo.findByUser(user);
posts.forEach(postRepo.remove(this));
userRepo.remove(user);
}
Java
복사
•
역참조가 아닌, 직접 User와 관련된 게시글 찾아 삭제
•
단방향 역참조 지원 X ,,, 그럼 이렇게 해야함,,,?
◦
양방향 쵝오,,,?
5.
다른 도메인에 대한 검증 :: 서비스 주입 vs 레포지토리 주입
One 레포지토리 ⇒ One 서비스 ONLY
: 나중에 안 복잡해진다!!!
a.
서비스 주입
i.
컨트롤러 단에서 다른 도메인의 서비스를 주입받고,
ii.
타 도메인 서비스 내에서 검증을 처리,
iii.
검증 실패 시 예외처리
b.
레포지토리 주입
i.
서비스 단에서 다른 도메인의 레포지토리를 주입받고
ii.
타 도메인 레포지토리를 활용한 검증 실행
iii.
검증 실패 시 예외처리
서비스 주입하여 처리하는 게 맞다고 팀원들간 의견수렴함
a.
컨트롤러 단에서 다른 서비스를 통한 검증 이후 본인 서비스 실행 여부 판별
b.
특정 레포지토리에 접근하는 서비스는 같은 도메인의 서비스만 두는 게 더 좋다는 생각
•
이코테 알고리즘 스터디 준비
◦
이진탐색 이론준비
◦
이진탐색 문제풀기
1.
이코테 >> 떡볶이 떡 만들기
2.
프로그래머스 >> 징검다리