안녕하세요~ 현재 아래 기술 스택을 사용한 API 서버가 존재합니다. Spring Boot 3 Kotlin JPA(JDBC) WebClient 예를 들면 아래와 같이 구성되어 있고, @RestController class SampleController( private val service: SampleService ) { @GetMapping("/sample") suspend fun start() { service.withoutDispatchers() } } @Component class SampleClient { private val webClient: WebClient by lazy { WebClient.builder() .baseUrl("https://api.com") .build() } suspend fun fetch(): Int { return webClient.get() .uri { uriBuilder -> uriBuilder.path("/number").build() } .retrieve() .awaitBody() } } interface SampleRepository : JpaRepository<SampleEntity, Long> @Service class SampleService( private val client: SampleClient, private val repository: SampleRepository, ) { suspend fun withoutDispatchers(): Int = coroutineScope { // non-blocking val deferred: Deferred<Int> = async { client.fetch() } // blocking val entity: List<SampleEntity> = repository.findAll() deferred.await() + entity.size } } Controller에서부터 suspend function으로 시작되면 Dispatchers.Unconfined를 사용하여 API 요청에 의해 할당받은 Tomcat 스레드를 그대로 사용하는 것으로 알고 있습니다. 이후 Service 레이어에서 suspend function이 동일하게 Dispatchers.Unconfined를 유지하기 때문에 요청 시 Tomcat 스레드는 그대로 사용되고 WebClient 요청 시 Dispatchers.IO를 사용하면, Tomcat 스레드와 별개로 Dispatchers 스레드 풀에서 스레드를 가져와 사용하는 것으로 알고 있습니다. 1번의 요청에서 Tomcat 스레드 1개 + Dispatchers 스레드 1개 = 총 2개가 사용됩니다. WebClient 요청 시 Dispatchers.IO를 생략하고 Dispatchers.Unconfined를 유지하면 , 코루틴의 재개 시 WebClient 응답을 동일한 Tomcat 스레드가 처리하게 하여 스레드 1개만을 사용하는 것이 서버에 더 효율적이지 않을까? 하는 생각이 들었습니다. 스레드가 Blocking되어도 WebClient의 NIO 이벤트 루프에 들어온 요청은 처리되어 응답에 대한 처리만 대기하고 있을 것이고, 테스트해보았을 때도 WebClient의 요청을 시작한 스레드가 JPARepository를 사용하는 코드에 의해 Blocking되어도 await()에서 문제 없이 응답을 받아올 수 있었습니다. 혹시 제가 생각하지 못한 또 다른 문제가 있을까요? 제가 혹시 잘못 알고 있는 부분이 있거나 Dispatchers.IO를 생략하지 못 하는 이유가 있다면 설명해주시면 감사하겠습니다!
안녕하세요. Kotlin과 Java의 현업에서의 활용에 있어 궁금한 내용이 있어 질문드려요. 서버를 개발하실 때 Kotlin과 SpringBoot를 활용한다고 수업시간에 지나가면서 잠깐 말씀해주셨는데요. 혹시 Kotlin + SpringBoot의 프로젝트 작업을 진행하실 때 전혀 Java를 사용하지 않고 활용하시는지 아니면 Java와 Kotlin을 같이 사용하는 지 현업에서 실제 어떻게 활용하시는지 궁금합니다. 그리고 Gradle에서 implementation("org.apache.commons:commons-lang3:3.0") 와 같은 외부 라이브러리를 Kotlin + SpringBoot 프로젝트에서 사용할 때 Java로 가져와서 사용하는지 아니면 Kotlin으로 따로 제작된 코드를 사용하는지 궁금합니다.
안녕하세요! 현재 자연어 기반 AI 장소 추천 & 실시간 예약 시스템 을 취업 포트폴리오 프로젝트로 개발 중입니다. 네이버 지도 API를 활용해 평점과 리뷰, 예약 가능 여부 등을 기준으로 장소를 추천하려고 합니다. 문제는 실제 예약과 리뷰는 네이버 외부에서 이루어지다 보니 , 실제 예약 가능 시간대와 사용자가 정말 예약했는지 여부를 알 수 없고, 그에 따라 내부 DB에 히스토리를 남기기도 어려운 상황 입니다. 그래서 고민 중인 부분은 실제 장소는 보여주되, 임의로 예약 가능시간대를 만들어 사용자가, 내부 DB에 예약 및 작성한 리뷰 히스토리를 저장하는 방식 으로 가짜 히스토리를 남기는 것이 현실적인지에 대한 것입니다. 임의로 가짜 예약 시스템을 만들자니 포트폴리오 질이 조금 떨어지지 않나 하는 고민이 커서 현재 막힌 상태입니다.. 혹시 저처럼 네이버 API 기반으로 구현하셨던 분들 중에 이런 상황에서 예약/리뷰 기록을 어떻게 처리하셨는지 , 또는 위 방식이 괜찮은 설계인지 조언을 부탁드립니다! 읽어주셔서 감사합니다!
스프링강의 입문 강의를 따라 강의를 학습중입니다. java 20 버전으로 설정해 사용중, 설정과 project structure에 sdk, jdk를 모두 20버전으로 설정하엿습니다. 하지만 화면 과 같은 오류가 떠서 자바 버전을 찾을 수 없다고 하는데. 혹시 어떻게 해결해야 하나여? 밑에는 버전사진입니다.
@Builder 어노테이션 사용 관련해서 질문이 있어 글을 작성하게 되었습니다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; // Properties private String name; } 위와 같이 @Entity 클래스 단에서 @Builder 어노테이션을 사용할 때, @NoArgsConstructor 와 @AllArgsConstructor 를 사용해야 하는 것으로 알고 있습니다. 이와 관련해서 질문을 작성하겠습니다! @Entity 와 @Builder 만 사용했을때에 에러가 발생합니다. "이는 @Entity 어노테이션을 사용했을때, 해당 클래스에 아무런 생성자가 없다면 @Entity 가 기본 생성자를 생성해줍니다." 라고 이해했는데 맞나요? 그렇다면 @Entity와 @Builder 를 사용하고, @AllArgsConstructor를 사용하면 기본 생성자는 @Entity가 만들어주었으므로, 기본 생성자를 만들어주는 역할을 하는 @NoArgsConstructor 는 필요없는 것 아닌가요? 그런데 @NoArgsConstructor까지 사용해야 에러가 발생하지 않습니다. @Builder를 사용한 클래스에 어떠한 생성자도 없다면 클래스의 모든 필드를 매개변수로 가지는 private 생성자를 만들어주는 것이 맞나요? 이것이 맞다면 2번의 질문과 반대로, @Builder 를 사용했기 때문에 @AllArgsConstructor 가 담당하는 모든 필드에 대한 생성자가 만들어져있으므로 @NoArgsConstructor 만 사용하면 되는 것 아닌가요? 여기에서도 @AllArgsConstructor 까지 사용해주어야 에러가 발생하지 않습니다. 질문이 좀 많은데 요약하자면, 빌더 패턴을 사용하려고 할때, @Entity, @Builder, @NoArgsConstructor, @AllArgsConstructor 이 네개의 어노테이션을 왜 꼭같이 사용해야 하는지가 궁금합니다. 감사합니다!
안녕하세요 강의 듣다 궁금한 점이 생겨서 질문 남깁니다 ! 스프링 부트,mysql 을 이용하여 프로젝트 작업 진행하기 위해 작업 진행전 docker로 초기 환경 세팅을 하고 두가지 동시에 띄우는 작업을 했습니다! 도커 연결전에는 IDE에서 run버튼을 눌러 작업 확인을 했었는데, 지금은 빌드 하고, compose up해서 확인을 해야하는걸까요? run버튼 누르니까 에러가 뜹니다.
❗ 프로젝트 주제 : 공개SW를 이용한 자취 관련 앱 서비스 ❗ 예상 프로젝트 일정 : ~ 9월 ❗ 예상 모집인원 : 디자이너: 1명, 백엔드: 1명 ❗ 현재 팀 구성 현황 : 백엔드 2명(Spring Boot), 프론트엔드(Flutter) : 2명 디자이너: 1명 ❗ 현재 진행 상황 : 기획 중 입니다 ❗ 프로젝트 관련 주의사항 : 다들 으쌰으쌰 함께해요 안녕하세요 !! 🙇♂ 🙇♂ 공개SW 개발자대회에 나갈 팀원을 모집하고 있습니다. 2024년 18회를 맞이하는 국내 최대 규모 ‘공개SW 도전의 장’입니다. 공개SW에 대한 기본적인 개념과 이해, GitHub 등 필요한 지식을 강의로 제공하며 프로젝트 기획, 개발, 구현, 협업 등의 개발 경험과 기능 테스트, 라이선스 검증을 통해 공개SW의 전반적인 개발 과정을 경험할 수 있다고 합니다 UI/UX디자이너 구하고 있습니다! 관심 있으신 분들은 오픈 채팅 방으로 깃허브 링크 보내주시면 감사하겠습니다 :) 많은 관심 부탁 드리겠습니다!! https://open.kakao.com/o/sGQpBNtg
안녕하세요. 개인 프로젝트를 진행하다 이해가 안되는 부분이 있어서 질문드립니다. 맛집 서비스를 위한 REST API (HTTPS)를 구성하는 프로젝트로, 맛집 정보들은 DB를 사용하여 관리 REST API는 CRUD 연산을 제공 할 것입니다. 일단 프론트단을 제외하고 백만 개발한거라 @RestController를 사용해서 테스트를 끝냈는데, 이제 프론트까지 개발하려고 하니 @RestController는 json 형식으로 데이터를 받잖아요. 화면을 생성해야하는데 @RestController와 별개로 새로운 클래스를 생성하여 @Controller를 붙여 뷰단만 따로 관리하는 컨트롤러를 생성하는게 좋을까요? @RestController는 REST API를 관리하는 컨트롤러, @Controller는 화면단만 관리하는 컨트롤러로 각각 생성하는게 좋은건지 아니면 개발했던 @RestController에 ModelAndView를 활용하는 것 중 뭐가 더 나은건지? 궁금해요. 찾아보니 RestController에 화면을 줄때 자바스크립트나 ajax를 사용하는 방법이 있긴한데 보통 뭐를 더 사용하고 뭐가 더 좋은지 궁금합니다.
start.spring.i o 에서 dependencies 에 아무것도 추가를 안하면 spirng 프레임워크를 사용하는 것이 되나요 ? 아니면 start.spring.i o 에서 dependencies 여부 상관없이 여기서 프로젝트를 다운받고 하게 되면 다 spring boot 프레임워크인건가요 ?
안녕하세요. 웹앱 기반의 앱을 만들고 있는 초급 개발자입니다. js에 있는 특정 로그인 암호화 알고리즘을 전부 kotlin에서 재정의하려하니 너무 골이 아파져서 방향을 어떻게 잡아야 할지 우선 여쭤보고 가는게 좋겠다고 생각하여 질문 남기게 되었습니다. 우선 제가 생각한 방법들을 이렇습니다. 로그인 기능만 네이티브앱에서 구현(암호화 알고리즘 kotlin으로 재정의) 해당 js함수를 사용하는 웹을 컨트롤러에서 호출하고, 응답만을 가져와서 Android 클라이언트에 반환 위 두 가지를 일단 시도중인데 2번 방식이 쉽지가 않네요. 애초에 가능한건지도 확실치가 않아 보입니다. 이런 고민을 해보신 적이 있다면 부디 조언 부탁드리겠습니다.
안녕하세요 토비님. 강의 잘 듣고있습니다. @ConditionalOnMissingBean 강의를 듣던중 궁굼한점이 생겨 질문을 남기게되었습니다. 아래와 같이 두개의 클래스가 존재할때, Profile 을 "study" 로 설정하고 스프링부트를 실행하면 의도대로 A 만 생성되고 "study" 가 아닐경우 B 가 생성되는것을 확인했습니다. 그런데 스프링부트에서는 항상 @Profile 이 붙은 A 클래스의 빈을 먼저 생성하고 그 이후 B 클래스의 @ConditionalOnMissingBean 조건이 수행된다는 보장이 되어있는지 궁굼합니다! 나름대로 검색을 해보았지만 관련 지식이 부족해서인지 적절한 키워드가 떠오르지않아 정보를 찾을수가 없어 질문을 드립니다! @Service @Profile("study") class A { ... } @Service @ConditionalOnMissingBean("A") class B { ... }
현재 spring boot 프로젝트를 GCP를 통해 배포하는 중인데요, rds 만들어서 연동도 잘 해두었고 ssh로 들어갔을때 mysql 연동도 잘 됩니다. 근데 jar 파일로 서버를 실행하려고 할 때 이런 에러가 나더라구요ㅜㅜ 찾아보니까 mysql 연동 문제라고 하던데 아무리 봐도 모르겠습니다... 제발 도와주세요ㅜㅜㅜ
Spring boot redirect질문입니다. 최근 spring boot, thymleaf를 사용하여 사이드 프로젝트를 진행중에 있습니다. spring boot서버를 클라우드에 배포를 하고 서비스를 테스트 과정에서 클라이언트의 요청에 따라 api를 통해 redirect를 하는 과정이 있습니다. 문제는 redirect를 하게되면 배포 서버 도메인으로 요청 되는것이 아니라 localhost 로 요청이 되어 원하는 화면으로 넘어가지 않습니다. 예를 들어 (1) https://port-0-teammatchservice-1cupyg2klvm5dc4u.sel5.cloudtype.app/ (2) https://localhost:8080/ 첫번째 주소로 redirect를 해야되는데 두번째 주소로 리다이렉트가 됩니다. 메인 페이지에서 다른 페이지로 넘어가는 거는 문제가 없지만 redirect를하게 되면 도메인이 localhost 로 바뀌어서 문제가 되고 있습니다. 그래서 이 문제를 해결하기 위해서 RedirectView를 사용해서 배포서버 도메인에 맞게 url을 수정하여 요청하는 방식을 하려고 합니다. 혹시 이 방법 말고 일괄적으로 redirect의 도메인 주소를 바꿀 수있는 방법이 있을까요?없다면 이 상황에서는 어떤 방법으로 하는게 좋을까요?
안녕하세요 영한님 수업을 듣다가 관리자 페이지를 만들어보면서 듣고 있는데요 제가 이것저것 찾아보면서 다른 기능들을 넣으면서 공부를 하고 있습니다. 하지만 의문점이 하나가 생겼습니다. 로그인, 로그아웃까지 구현을 했으나, 이전에 로그인한 시간 팝업에 띄우고 싶은데 Session으로 하면 정해진 시간까지 Session이 동작하여서 이것을 쓰면 안 될 것 같은데요 어떤 기능을 공부해서 사용해야 하나요?
안녕하세요 Querydsl Projection 을 활용해 DTO에 담는경우 성능 관련 질문이 있습니다. Querydsl에서 Projections.constructor를 활용해서 query를 작성하는경우 fetchJoin이 되지 않더라구요. 일대 다 관계에서 fetchJoin을 하지 않게되면 n+1 이슈가 발생할거 같은데 Projections을 활용하는 환경에서 성능개선은 어떻게 해야할까요?