관리 메뉴

A seeker after truth

개발 과정서 했던 질문 본문

Projects/날씨-코디앱 개발 과정

개발 과정서 했던 질문

dr.meteor 2020. 9. 10. 23:27

 

  • 크리에이트 리퀘스트 코드에 photoUrl(url) 있는거 이해 안됨. 뭐지 진짜.. 포스트 객체랑 관련있나 오히려..? 아니 이게 빌더 패턴 원리상 가능한 일인지 그게 잘… => 해결. post 객체랑 관련됨…
  • 일단 내가 코드는 어케 작성할지 여러 개의 코드를 보고 어느정도 감을 잡았다. 궁금한건 이걸 어느 파일/메서드에 넣느냐, 메서드를 따로 만들면 어디에 만드느냐, 파일을 따로 만들면 무슨 파일을 어디에 만드느냐.
    일단 코드를 보니 서비스는 아니야. 서비스는 리퀘스트를 받고, post 객체 하나 만들고, 이걸 레포에다가 저장하는 역할 뿐임.
    PostCreateRequest는 엔티티를 만들 뿐이고…
    컨트롤러는 그냥 응답 코드를 보낸다. 그러므로 아니다…

    가장 가능성 있어 보이는 건 서비스 폴더 밑에 파일 하나 만들언서 메서드로 사용하는 것이다. 어… 여기 있는 메서드들이 그나마 다른 파일들에서 좀 쓰이는 것 같기 때문.
  • 왜 스타일 폴더 밑에는 또 다른 도메인 폴더를 하나 더 정의해둔 것? 내일 코드를 마저 더 읽어보자.
  • 오브젝트 맵퍼 사용에서 어려움을 겪고있음. 지금까지 공부해본 바에 따르면 뭐 json 을 string으로 바꿔준다던가 그런 것밖에 없었기 때문. json 파싱해서 원하는 데이터 받는거 따로 다 코드로 구현해야함? 아니면 뭐 캐/밸류 맵핑이 됐든 뭐가됐든 제이슨 데이터 받은 담에 그 안에서 원하는 데이터 바로 나타내주는 메서드는 없나?

    지금 나와있는 오브젝트맵퍼라는 메서드에 지금 파라미터가 없는데, 그럼 뭘 받아서 이런 식으로 변환해줄수가 없잖아…? 이 메서드 어케 쓰는거지…?ㅠㅠ

 

그동안 최대한 내가 혼자 해결해보려했는데 끝내 정말 막히는 부분을 질문할게.

지금 코드 상에서 JSON을 StringBuilder 타입에다가 저장해서 이를 마지막에 리턴하고 있는데, 자바는 고나 파이썬처럼 언어에서 자체적으로 지원하는 표준 json 라이브러리가 없으니까 제이슨 타입으로 반환할 수가 없잖아. 그래서 대체 어케 해야하나 싶더라고.

검색을 많이 해봤는데, 대부분은 org.json.라이브러리를 써서 파싱하더라고. 나는 jackson으로 받아서 파싱하려고 정말! 많이 찾아봤는데, 이건 스트링<->json<->pojo 간 변환하는데 쓰는거지 파싱(내가 원하는 정보만 딱 추출)하는 방법은 끝내 못찾았어.

그럼 그냥 내가 찾은  org.json 사용하는 방법으로 할지, 이 부분만 다른 사람이 코드 작성을 할지…

내가 찾은 방법은 이 포스트에 나와 https://a1010100z.tistory.com/5

 

 

 

 

[8/8, 현재 고민해야 할 부분]

  1. 온 응답을 난 지금 스트링 빌더로 받고 있는데, 이건 제이슨이 아니잖아. 근데 난 분명 제이슨을 받아야 하는데?
    => java json 받기 검색중이었
    참고로 원래 정석적인 방법은 스트링 빌더를 스트링으로 바꾼 뒤 이걸 다시 제이슨으로 바꾸는 방법. 이때 잭슨 라이브러리는 안쓰이고 자꾸  org.json.(뭐시기)란 라이브러리만 쓰임
  2. 제이슨을 받고난 뒤 여기서 원하는 정보를 어떻게 추출할 것인가?
    이를테면 이거?
    https://a1010100z.tistory.com/5

    https://codechacha.com/ko/java-parse-json/
  3. 파라미터로 위도경도 받는 부분. 어노테이션 활용 여부
  4. mysql 도커로 연동해야 함

 

 

[8/22 질문]

컨트롤러를 사용해야 한다는 걸 깨달았음

근데 요청이 오면 json이 바로 올텐데…

이것을 리턴해야 하는가? 혹은 뭐… 어…. getWeatherInfo 객체 하나 만든 담에 이것 통해서 메서드 호출하고, 여기 파라미터로 제이슨을 넘겨준다

아… 이러면 말이 된다

파라미터 넘겨주는걸 … lat, lon으로 할 것인지…

그럼 위도 경도는 어디서 받아서 컨트롤러에서 써먹는 것인지…이걸 모르겠다고…

 

 

이제 진짜 질문. 

일단 어느 컨트롤러에 들어가야 할지 모르겠음.

그담에, 이 날씨 및 위치 정보가 포스트 엔티티에 들어갈 정보의 일부인데, 음… 지금은 아직 로직 안끼워도 되는건가? 

그리고 이 컨트롤러가 필요할 것인가? 의 전제는… 이걸 컨트롤러-서비스  를 거치는 로직으로 따로 분리해야할 이유를 알아야하는데… 이건 너무 복잡해서 그렇다고 생각할 수 있지…

그럼 이  날씨 정보를 반환하는 로직은 어디에 끼워넣을 수 있을런지…? 일단 피드 정보 반환할 때… 메인에다가 날씨 정보 띄워야 하면 그땐 

 

도대체 날씨 정보 받아오는 메서드를 어디서 호출해야하는 거야… 분명 게시물 작성 로직에서 써먹는것 같은데, 그럼 PostService인가 해서 코드 보면 막상 이거 아닌것 같고, 또 CreateRequest/Response에서 보자니 이것도 아닌 것 같고 ㅠㅠ 둘중 어디 들어갸아하는거시여

 

[할일 8/22]

  1. 날씨 정보 반환 테스트 코드
  2. 메인 피드 로직에서 현재 날씨&위치 정보 반환하기(current weather api)
    —————————
  3. 게시물 작성할 떄 필요한 historical 날씨 데이터(이거 포스트서비스에다가 넣는거 맞대 create메서드)

 

 

웨더 도메인으로 빠지면 책임을 분리하는 맥락이 된다.

원투원은 잘 안쓴다 한 테이블에 엄청많은 데이터가 있으면 그렇지만…

리퀘스트가 클라에서 요청하는건데 

컨트롤러가 외부 에ㅂ피아이를 받는 부분인데, 

클라이언트가 요청을 ‘보낸’ 모든 데이터를 담는 곳. 클라가 보낸거지

클라에서 받는 데이터가 아니라는 의미

 

날씨랑 위치는 역할이 다르기 때문에 따로 빼는게 더 낫다

왜냐면 나중에 각각에 다른 비즈니스 로직이 추가될 수 있기 때문

 

 

[8/28 금 질문]

  1. Style 클래스가 스타일 종류 들어가는 클래스인건가? 근데 created/updated 필요한지 궁금해서
    나중에 바뀔 수도 있어서. 많이 쓰이진 않겠지만. 데베 테이블에선 이게 언제 생성되고 업뎃 됐는지 로그 보는 경우가 있다고 . 이런거 하나하나가 필요할 때가 있다고 .
    진짜 중요한 테이블인 경우엔 누가 이걸 언제 만들었냐 뿐만 아니라 언제 수정했냐까지 들어가는 경우가 있다고 .
  2. PostStyleService save 메서드 로직 이해가안되네 이거 물어보자
  3. user, style, post 엔티티의 access level nth, private, protected 이유 스타일은 이해되는 같고, 아니아니 아니지 그니까 AllArgsConstructor, NoArgsConstructor 나온 access level 이거에 대해 설명좀이게 대체 어디에 적용되는건지 모르겠는데, 클래스의 생성자 자체에 대한게 되는 건가 혹시?

    ~ 이거 알았음 NoArgsConstructor 파라미터 없는 기본 생성자 생성, AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자, @RequiredArgsConstructor final이나 @NonNull 필드 값만 파라미터로 받는 생성자
  4. weather 객체는 고유, 유일한 것인지 비교할 없으므로 equalsandhashcode 어노테이션 안붙여도 되는건가?
    JPA
    에서 관리할거면 붙이고, 아니면 굳이
    영속성 컨텍스트: 기존에 어플리케이션 데베 있는 상황에서, 제이피에이 안쓰면 둘만 있는데 이걸 쓰면 사이에 하나의 레이어가 생긴다고 보면 된다. 이게 영속성 컨텍스트인데, 중간에서 캐시 역할? 원래같음 인서트 하면 바로 데베 들어가고, 데베 하면 바로 데베로 가지만,,, 영속성 컨텍스트에 이게 있으면 여기서 이걸 갖고올 수도 있고, 트랜잭션이 끝나면 바뀐
    컬렉션 종류 중에 set 안에는 중복된 데이터가 안들어가는 컬렉션이고, 이거 안에서 equals~ 쓰면 검사를…. ?
  5. 엔티티들의 필드들이 전부 private 이유그리고 final 선언된 필드가 하나도 없는데 뭐하러
    서비스랑 레포지토리 자체도 빈이래
    주입 방법이 3가지.있는데 autowired 보단 생성자나 set으로 하는 방법이 낫다고 . 좋은 이유는 구글링. 빈을 바꿀 이유가 없어서
  6. postweather, currentweather 있는데, postweather 저장해두고 나중에 큐레이션하거나 정보 불러오거나 게시물 작성할 쓸일이 있으니까 id 포스트에 대한 외래키 같은 걸로 식별할 있을 텐데, currentweather 그런게 필요없을 같은데
  7. OotdResponse 왜있지? 이건 스스로 이해해보기
  8. PostGetResponse, StyleResponse, PostCreateResponse constructor 관련 어노테이션 안하고 직접 코딩했는지
    dto 내부에서 엔티티 클래스 갖는건 괜찮지만 역으로 엔티티 클래스에서 디티오 클래스를 갖고 있는건 안좋다고생각
  9. extends JpaRepository 파일들 오른쪽엔 Long 타입이 붙어있는? 거기에 아이디가 들어가는 것인가?
    그리고 save 메서드 같은거 구현한 없는데, 이게 어케 호츨되었을까 심지어 레포 파일엔 어노테이션하나 마땅한게 없는데. 레포 파일들처럼 코드 작성하면 혹시 crud 관련 메서드는 자동으로 생성인가?

 

 

한 엔티티 안에서 다른 엔티티를 필드로 포함하는 경우의 대표적인 예가 포스트 안에 포스트 스타일 엔티티가 있다는 것. 근데… 얘는 어… 작성시 유저가 선택하는 거지. 근데 이 로직은 우리 로직에 없네? 생각해보니까?

이게 그 날씨 정보 부르는 서비스 로직을 어디서 호출할지 고민하면서 알게된 사실…

 

  • 스타일 서비스: 이건 스타일 종류를 불러오는 로직이다. 단, 반환 부분에 있는 스트림 및 컬렉션 코드는 이해 안됨
  • 포스트 스타일 서비스: 이 로직에 정말 주목할 필요가 있음.
    일단 PostStyle 도메인 안에 create란 메서드가 있고, 여기서 빌더 패턴 이용해서 PostStyle 객체/생성자를 반환한다. 음 내가 궁금한 부분은, 이 PostStyle… 이게 젤 어렵군 그 이 코드에서

@ManyToOne

@JoinColumn(name = "post_id")

private Post post;

 

여기서 post_id 외래키이면서 Post PostStyle 맵핑된다는 ? 인가?
: 이건 그냥 나보고 공부해보라고 했음.

 

 

[9/10 리뷰 받을 내용]

숫자 데이터는 대부분 더블 타입으로 오는데, 0일 때만 인티저로 온다. 나는 이걸 맵퍼 클래스, 타입 캐스팅, 다양한 내장 함수, 제네릭 등으로 고려해보았으나 다 뭔가 마땅치 않아서 그냥 try/catch로 했는데, 이거 코드 리뷰 받을 것.