Skip to content

Week5 멘토링 일지

동재 edited this page Dec 12, 2023 · 1 revision

✔️ 체크리스트

이번 주 멘토링에서 이야기 나누면 좋을 주제입니다.

멘토가 보기에 우리 팀은 어떤지 의견을 구해보세요.

  • 사용자가 서비스를 사용할 수 있는 수준으로 주요 기능이 개발되었다.
  • GitHub 저장소만 봐도 프로젝트 개요, 기술적 도전, 구현 과정을 누구나 알 수 있다.
  • 나와 우리 팀의 기술적인 자랑 거리나 강점이 무엇인지 그 이유와 함께 설명할 수 있다.
  • 6주차에 리팩토링 또는 개선할 영역이 무엇인지 인지하고 있다.

iOS

  • 뷰컨트롤러에서 인자값을 넘겨줄 지, 뷰모델을 넘겨줄 지 고민
      • 뷰컨트롤러와 뷰모델의 관계는 꼭 1대1이여야하는가?
    • 상황
      • 홈에서 상세페이지로 넘어갈 때 상세페이지에는 postID가 필요합니다. 이때, HomeViewController에서 DetailViewModel을 생성하면서 인자로 postID를 넘겨주는 방법과 HomeViewController에서 DetailViewController만 생성하고 인자로 postID를 넘겨준 후 DetailViewController 내부에서 DetailViewModel을 생성하면서 인자를 주입해주는 방법중에 고민입니다.
  • 토큰 만료 관리에 대한 예시 코드 중에서 클라이언트에서 JWT를 파싱하여 expire date를 검사하여 요청을 보내는 코드를 봤는데, 실무에서도 이렇게 구현되기도 하는지?
  • 페이지네이션 구현 방법 중에 contentOffset을 활용하거나 prefetch를 활용하는 것 크게 두 가지로 있는 것 같은데, 어느 쪽을 추천하시는지.
  • 네트워크 호출을 최소화 하는 것과 화면전환 간 뷰 컨트롤러 매개변수 전달을 최소화하는 것 중 어느 쪽을 선택해야할지.
  • 소켓통신에서 JWT를 헤더에 씌우는 방법.. URLSessionWebSocketTask를 이용 ⇒ 해결
WebSocket.shared.url = URL(string: "ws://www.village-api.shop/chats")
try? WebSocket.shared.openWebSocket()
WebSocket.shared.sendJoinRoom(roomID: "164")

func openWebSocket() throws {
        guard let url = url else { throw WebSocketError.invalidURL }

        let urlSession = URLSession.shared
        let webSocketTask = urlSession.webSocketTask(with: url)
        webSocketTask.resume()
        
        self.webSocketTask = webSocketTask
        
        self.startPing()
        
        self.receiveEvent()
    }
// 아래와 같이 헤더에 토큰을 씌워서 보내봤는데, 서버에서 헤더를 인식하지않습니다.
// 현재 JWT를 씌우지않고 소켓통신을 하는 방식으로 진행중입니다.

func openWebSocket() throws {
        guard let url = url else { throw WebSocketError.invalidURL }
				
				var request = URLRequest(url: url)
				guard let accessToken = JWTManager.shared.get()?.accessToken else { return }
				request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
				request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        let urlSession = URLSession.shared
        let webSocketTask = urlSession.webSocketTask(with: request)
        webSocketTask.resume()
        
        self.webSocketTask = webSocketTask
        
        self.startPing()
        
        self.receiveEvent()
    }

BE

  • 현재 user 서비스 레이어에 너무 많은 레파지토리가 사용중입니다. 이렇게 user를 다루는 서비스에서 다른 리소스들에 대한 레파지토리를 많이 사용하는 것이 일반적인지 궁금합니다

    constructor(
        @InjectRepository(PostEntity)
        private postRepository: Repository<PostEntity>,
        @InjectRepository(UserEntity)
        private userRepository: Repository<UserEntity>,
        @InjectRepository(PostImageEntity)
        private postImageRepository: Repository<PostImageEntity>,
        @InjectRepository(BlockUserEntity)
        private blockUserRepository: Repository<BlockUserEntity>,
        @InjectRepository(BlockPostEntity)
        private blockPostRepository: Repository<BlockPostEntity>,
        @InjectRepository(RegistrationTokenEntity)
        private registrationTokenRepository: Repository<RegistrationTokenEntity>,
        private s3Handler: S3Handler,
        private configService: ConfigService,
      ) {}
  • 지금 까지 서버 한대에서 개발 테스트를 진행하였습니다. 이러다 보니 저희 백엔드에서 테스트 할 때 iOS 분들이 서버와 통신을 못하여 불편한 문제가 발생하여서 서버를 분리하는 작업을 진행하였습니다. 현업에서는 개발할 때 서버를 어떻게 분리하여 작업하시는지 궁금합니다.

  • 소켓을 통해 채팅을 하는데 있었던 문제였는데 글로 쓰기가 많이 길어서 멘토링때 자세히 설명드리겠습니다. 결론은 완벽한 해결방법이 없을 때 어떤 기준으로 코드를 작성해야할까요?

  • jwt를 현업에서는 어떤 정책으로 사용하고 계신지 궁금합니다.

  • OAuth 2.0에서 회원가입을 어떻게 처리 할지 고민이 있었는데 현업에서 어떤식으로 처리하시는지 궁금합니다.

✔️ 멘토링 내용

멘토링 시간에 나눈 이야기를 기록해보세요.

Clone this wiki locally