개발자

서로다른 프로젝트 컨트롤러끼리 데이터 주고 받을 방법 질문드립니다

2023년 04월 26일조회 280

안녕하세요 선배님들! 스프링부트로 모놀리식 방식을 써서 프로젝트를 만들었었습니다. 그리고 이 프로젝트로 3tier로 BT PT 각각의 다른 프로젝트로 나누어서 개별 컨테이너로 만들고 도커 컴포즈로 실행하는게 목표입니다 현재 bt pt를 나누기는 했으나 pt(view,controller)에는 html 템플릿과 화면전송 해주는 컨트롤러만 있고 bt(컨트롤러 서비스 레파지토리 엔티티)에서 DB에서 받은 데이터 가공 후 BT 컨트롤러에서 PT 컨트롤러로 데이터를 이동시켜야 하는데 방법을 못찾아서 질문 드립니다 ㅜㅜ redirect로 화면 전환과 redirectattribues로 스트링까지는 전송했지만 유저 리스트 같은건 pt에는 엔티티도 없다보니 옮길 방법이 도저히 떠오르지 않습니다

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

유택범님의 프로필 사진

안녕하세요~ 질문해주신 내용으로 보았을 땐 PT의 컨트롤러가 호출되면 어떤 데이터가 필요한지 판단한 뒤에 그 데이터를 반환하는 BT의 컨트롤러를 호출하면 될 것 같은데요. 더 설명이 필요하다면 말씀 부탁드릴게요!

profile picture

익명

작성자

2023년 04월 26일

답변주셔서 감사합니다! BT와 PT가 각각 다른 프로젝트다 보니 호출하는 방법이나 유저리스트를 BT에서 PT로 넘기는 방법을 모르겠습니다 ㅜㅜ

유택범님의 프로필 사진

유택범

Software Developer2023년 04월 26일

BT와 PT가 갖고있는 컨트롤러들 예시를 말씀해주실 수 있을까요? 그걸로 설명드리면 좀 더 편하지 않을까 싶어요!

profile picture

익명

작성자

2023년 04월 26일

Pt 컨트롤러(포트번호 8082) 입니다 @GetMapping("/pt/write") //회원가입페이지 public String pt_write() { return "redirect:http://localhost:8081/bt/write"; } @GetMapping("/user/write") // BT에서 받은 부서종류 취미종류 데이터로 가입페이지 출력 public String user_write(Model model, DeptDto deptList, HobbyDto hobbyList) { model.addAttribute("deptList",deptList); model.addAttribute("hobbyList",hobbyList); return "user/write"; }

profile picture

익명

작성자

2023년 04월 26일

BT 컨트롤러 입니다(포트번호 8081) @GetMapping("/bt/write") //가입 화면에에서 DB에 있는 부서 종류와 취미 종류 불러옴 public String user_write(RedirectAttributes redi) { redi.addAttribute("deptList", service.deptList()); redi.addAttribute("hobbyList", service.hobbyList()); return "redirect:http://localhost:8082/user/write"; }

profile picture

익명

작성자

2023년 04월 26일

화면에서 회원가입을 누름 >> PT 컨트롤러에서 들어가서 BT 컨트롤러로 넘김 >> BT컨트롤러에서 DB에서 취미 종류 리스트와 부서명 리스트를 가져옴 (취미 종류를 DB에 저장하면 가입화면에서도 취미종류 업데이트, 부서명도 마찬가지) >> 가져온 데이터를 PT로 전달 >> PT는 BT에서 받은 리스트들로 타임리프를 이용해서 회원가입페이지 출력 요게 지금 구성하려는 시나리오 입니다.

유택범님의 프로필 사진

유택범

Software Developer2023년 04월 26일

상세한 답변 감사드립니다! 일단 제가 이해하기로는 1) 화면에서 회원가입 버튼을 클릭 2) PT 컨트롤러의 pt_write() 메소드가 호출 3) pt_write() 메소드에서는 redirect를 하고 이로 인해 BT 컨트롤러의 user_write() 메소드가 호출 4) BT 컨트롤러의 user_write() 메소드에서 DB에 저장된 deptList, hobbyList를 PT 컨트롤러로 전달(redirect를 사용해 user_write() 메소드 호출) 5) PT 컨트롤러의 user_wriet() 메소드에서 타임리프를 사용해 회원가입 페이지 출력 이 순서로 이해했습니다. (혹시 잘못된 부분이 있다면 말씀 부탁드려요!) 질문자님께서 생각하신 3 tier 아키텍처를 정확히 이해하지 못했을 수 있겠지만 제가 보아온 3 tier 아키텍처를 기반으로 설명드려보도록 하겠습니다. 제가 이해한 시나리오대로 구현한다면, 아래처럼 작성할 것 같습니다. 먼저, 회원가입 버튼을 클릭하면 PT 컨트롤러의 pt_write() 가 호출된다고 가정하고 이 메소드는 지금 작성하신것 대신 8082/user/write 로 redirect 할 것 같습니다. 그리고 8082/user/write로 redirect되어 호출된 PT 컨트롤러의 user_write() 메소드에서는 8081/bt/write로 GET request를 보낼 것 같습니다. 8081/bt/write에 매핑되어 있는 BT 컨트롤러의 user_write() 메소드에서는 지금처럼 DB에 있는 정보를 읽어오되, redirect를 return하는 것이 아니라 deptList와 hobbyList를 담아서 return하구요. 이렇게 되면 PT 컨트롤러의 user_write() 메소드 내에서는 DB에 저장된 취미종류, 부서 리스트를 받아오게 되고 이를 타임리프를 이용해 페이지로 만들면 된다고 생각했습니다. BT와 PT 간의 데이터 전송에 RedirectAttributes를 사용할 필요가 없을 것 같고 위 흐름대로 하는게 제가 보기에는 자연스러울 것 같은데요! 혹시 제가 질문자님의 상황을 잘못 이해했다거나, 설명이 부족한 부분이 있다면 말씀 부탁드리겠습니다. 댓글로 달기 불편하시면 메시지를 주셔도 괜찮구요!

연양갱님의 프로필 사진

안녕하세요. 현재 구축하고 계신 서비스를 간략하게 정리하자면, Frontend 서버, BackEnd 서버, DB 이렇게 세가지로 나누는것이 맞을까요?? 같은 localhost에서 기동된다 하더라도 포트번호가 다른 8081, 8082번일 경우는 둘은 다른 별개의 서비스로 봐주시면 됩니다. 서비스에서 다른 서비스를 연결하기 위해서는, 질문자님께서 주신 pt서버(8082)에서 bt서버(8081)로 Request를 요청해 bt서버에서 비지니스 로직을 실행한 뒤 Response를 전달하는 그림으로 생각해주시면 될것 같네요. 서비스에서 다른 서비스를 요청하는 방법은, Apache HttpClient 부터 RestTemplate, WebClient 등등 종류가 많지만 간단하게 라이브러리를 설치하고 인터페이스로 선언만 하면 다른 서비스로 요청을 할 수 있는 FeignClient를 추천드리니 한번 FeignClient에 대해 공부해보셔도 도움이 될것 같네요. 물론 위에 설명한 라이브러리들도 안좋다거나 그런것은 아닙니다 ㅎㅎ 서비스 끼리 Http통신을 하는 방법은 위와 같은 방법으로 진행 해주시면 됩니다. 하지만 이전에 Spring에서 Request가 요청이 들어왔을 경우 어떻게 처리를 한뒤 Response로 내보내는지에 대해 좀더 보충하셔서 공부하신다면 많은 도뭄이 될것같네요. 추가적으로 pt서버에서 말씀하신 Entity의 경우는 DB와 직접적으로 통신할 서버는 bt서버이므로 Entity를 가지고 있지 않아도 됩니다. 다만 View 화면에 뿌려주고자 하는 데이터를 가지고 있기 위해서는 bt서버에서 Entity를 통해 가공한 데이터를 전달하면 pt서버의 dto객체에서 받아 view에서 뿌려주면 될것같네요.

profile picture

익명

작성자

2023년 04월 27일

내용도 알차지만 글이 술술 읽히도록 너무 잘쓰십니다....!! 제가 두서없이 말했는데도 이해해주시고 답변해주셔서 감사합니다! 안그래도 몇시간 전부터 챗gpt 도움을 받아서 RestTemplate을 이용해서 바꿔보고 있는데 좀 어려워서 버벅거리고 있었습니다 ㅜㅜ 답변 보니까 다행히 틀린길로 가고있진 않아서 한숨 돌렸어요. 말씀해부신 FeignClient도 꼭 참고해볼게요!! BT에서 엔티티를 전달 할 때 Dto로 변환 후에 PT로 보내면 되는걸 바보같이 생각을 못했네요... 받을 때는 변환해서 받아놓고.. 말씀대로 스프링에서 reqeust respons부터 개념을 다 잡고 해볼게요!정말 감사합니다!!

커리어리 AI 봇님의 프로필 사진

BT 컨트롤러에서 PT 컨트롤러로 데이터를 전달하는 방법은 크게 두 가지가 있습니다. 1. REST API를 사용하여 데이터 전송 BT 컨트롤러에서 PT 컨트롤러로 데이터를 전송할 때, REST API를 사용하는 방법이 있습니다. BT 컨트롤러에서는 PT 컨트롤러의 REST API를 호출하여 데이터를 전송하고, PT 컨트롤러는 전송받은 데이터를 가지고 화면을 렌더링합니다. 2. 공통 모듈을 사용하여 데이터 전송 BT 컨트롤러와 PT 컨트롤러 사이에 공통으로 사용하는 모듈을 만들어 데이터를 전송하는 방법도 있습니다. BT 컨트롤러에서 데이터를 가공하고, 공통 모듈을 사용하여 PT 컨트롤러로 데이터를 전송합니다. PT 컨트롤러는 전송받은 데이터를 가지고 화면을 렌더링합니다. 이 두 가지 방법 중 어떤 방법을 사용할지는 프로젝트의 구조와 요구사항에 따라 다르게 결정될 수 있습니다. REST API를 사용하면 BT 컨트롤러와 PT 컨트롤러가 완전히 분리되어 있어서 서로간의 의존성이 낮아지는 장점이 있습니다. 반면, 공통 모듈을 사용하면 코드의 중복을 줄일 수 있어서 유지보수에 용이합니다.

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!