묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
baseContext가 궁금합니다.
rvAdapter.itemClick = object : RVAdapter.ItemClick{ override fun onClick(view: View, position: Int) { val intent = Intent(baseContext, ViewActivity::class.java) intent.putExtra("url", items[position].url) intent.putExtra("title", items[position].titleText) intent.putExtra("titleImageUrl", items[position].titleImageUrl) startActivity(intent) } }안녕하세요 개복치개발자님. 항상 강사님의 좋은 강의 감사한 마음으로 잘 듣고 있습니다. 섹션 7 망고플레이트 앱 만들기를 공부하다가 궁금한 부분이 있어서 질문 남깁니다.val intent = Intent(baseContext, ViewActivity::class.java)이 부분에서 baseContext가 의미가하는게 무엇인지, 그리고 여기서 this를 사용하면 안되고 baseContext를 사용해야 하는 까닭이 궁금합니다.답변 주시면 감사하겠습니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
안녕하세요 스프링 시큐리티 로그인 개발 질문 드려용 ^^
안녕하세요.강의 내용중에 궁금한게 있어서 질문 드립니다.로그인 폼을 거치지 않고 POST body를 전달해서 바로 로그인 해보면 어떨까 해서 시도 했는데 잘 되지 않네요 ...fun filterChain(httpSecurity: HttpSecurity): SecurityFilterChain { return httpSecurity .authorizeHttpRequests { authorizeHttpRequests -> authorizeHttpRequests .requestMatchers(AntPathRequestMatcher("/admin/**")).authenticated() .anyRequest().permitAll() }.csrf {csrf -> csrf.disable() }.headers { headers -> headers.addHeaderWriter(XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN)) }.formLogin { formLogin -> formLogin.defaultSuccessUrl("/h2-console") // 추가 ////////////////////////////////////////// formLogin.loginProcessingUrl("/login") formLogin.usernameParameter("email") formLogin.passwordParameter("password") }.logout { logout-> logout.logoutRequestMatcher(AntPathRequestMatcher("/admin/logout")) .logoutSuccessUrl("/") }.build() }강의 내용중에 제가 주석으로 추가 내용 달았어요...그리고 Entity는 아래처럼 구성했습니다.class Account(email: String, pw: String): BaseEntity(), UserDetails {........@field:NotNull @Column(unique = true) var email: String = email @Column(name = "password") var pw: String = pw그래서위에처럼 전달했습니다.그리고 run accountRepository에 디버깅 브레이크를 걸고 Post 메세지를 쐈습니다.그런데 디버깅 걸린건 "" 공백이네요.프론트 엔드에서 시큐리티 로그인페이지를 만들고 아디이 패스워드를 전달해서 제어하려고 시도 했는데 뭔가 문제가 있나봐요...답변 해주지면 감사하겠습니다.@Service class AdminSecurityService( private val accoutRepository: AccountRepository ) : UserDetailsService { override fun loadUserByUsername(email: String): UserDetails { return accoutRepository.findByEmail(email) .orElseThrow{RuntimeException("사용자 정보를 찾을 수없습니다.") } } }=========추가 질문 드려요지금 시큐리티 로그인은 Spring boot 초기화 스타트 한후 유저의 접근을 막는 방화벽 같은 용도로 사용하는건가요??아니면 웹 "react" http://localhost:3000/에서 로그인 폼 게발한후에 로그인 정보(이메일, 패스워드 아이디)를 http://localhost:8080/login 에 POST / GET 방식으로 전달하고 시큐리티에 접근해서 로그인 하는 사용자 로그인 목적으로 사용하는건지 ...이게 intellij IDEA에 웹페이지랑 스프링 부트를 개발해서 강의내용은 이해하는데 프론트 엔드와 백엔드와의 통신으로 본다면 좀 헛깔려요로그인 페이지는 프론트 엔드에서 만드는게 아니라 백엔드에서 만들어야하나... 그럼 프론트엔드에서 백엔드에 접근해 시큐리티 로그인을 한후 로그인 성공 했다는 메세지를 어떻게 프론트 엔드에 전달해야되는지... 그냥 관리자 페이지(사용자 목록 리스트나 사용자 로그인 접근 정보를 보는 용도)를 사용할때 시큐리티 로그인을 사용하고 user로그인(작성한 글, 좋아요 같은 카운트, 로그인한 전화번호, 사진 정보)은 따로 user 로그인하는 Api Controller에 접근해서 로그인 하는건지 좀 헛깔려요.현재 구글에서 찾아보면 관리페이지는 시큐리티로 접근 사용자, 게스트튼 로그인 API로 접근해서 관리하는거 같은데 정보 찾는게 어렵네요...
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
class 와 data class
안녕하세요 강의 잘 듣고있습니다.class 에는 setter 와 getter 를 생성하지 않고data class 에는 var 로 받을경우 setter 와 getter 가 생성되면 이외의 다른 메서들도 자동으로 생성이 된다고 하셨습니다.그러면 class 는 더이상 사용하지 않나요 ?
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
토큰에서 예외 발생시 처리
안녕하세요 강사님, 좋은 강의 잘 듣고 있습니다.따라하던 중 토큰을 잘못 입력했을 경우 403 Forbidden 에러가 발생하는데 이 에러의 경우는 RestControllerAdvice 에서 처리를 할 수 없는건가요??이 경우에도 Response형태를 통일 시키고 싶은데 어떻게 하면 될까요..?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
테스트 코드에서 JpaRepository.save 가 안되는데 문제가 뭔지 모르겠어요.
안녕하세요. 몇달간 넘 바빠서 스프링 공부를 못했네요.프로젝트를 하나 새롭게 생성한다음에 첨부터 강의 하나 하나 보면서 프로젝트에 기능을 추가 하고 있었습니다. 그리고 Repository와 Service를 까지 왔어요..이 둘의 차이점도 확인해서 비교 하고 그런데 역시 의존성 주입은 좀 어렵더라구요.. 아마 이부분을 제가 몰라서 아래 설명할 코드에 예상하지 못하는 결과가 나왔을꺼 같은데 흠... 사실 질문 하기 미안 하긴 하지만 그래도 빨리 좀 알아야해서 질문 드립니다. 일단 깃 주소부터 올립니다. justkjy/about-coffee: about coffee server (github.com)https://github.com/justkjy/about-coffee여기에 test>kotlin>... >service>PresentationServiceTest> fun insertMenuTest() {...............val testCoffeeMenu = presentationService.coffeeMenuSave(coffeeMenuDto)...............}디버깅 타서 src/main/kotlin/com/example/aboutcoffee/service/PresentationService.kt fun coffeeMenuSave(menuDTO: CoffeeMenuDTO):CoffeeMenu? { ................. resultMenu = presentationRepository.coffeeMenuSave(menuSave) ................ }이 부분 왜 null을 리턴하는지 모르겠어요...분명 데이터 저장하는게 맞는데 ....mock 설정이 잘못되서 그런거겠죠??ㅠ.ㅠ 에러를 못잡아서 잠을 못자고 있네요이 프로젝트 완료하면 react로 작성된 커피 블러그랑 연동 하려 했는데 ... 시간이 꽤 걸릴듯 하네요 ㅠ.ㅠ
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
docker 빌드가 이루어지지 않고있어요 ㅜㅜ
혼자서 해결해보려고하는데 해결할수가 없네요 저런 에러만 나오고 알방법이 없어서 이렇게 질문드려요 깃허브링크까지 있어요 꼭 해결하고싶어요!!https://github.com/Minzion0/portfolio
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
버튼 setOnClickListener 작동하지 않습니다
섹션5, 네비게이션을 만들어보는 강의에서네비게이션 버튼을 만들고 프래그먼트로 연결시키는 작업까지 완료하고 실행시켜보았을 때 버튼을 눌렀지만, 2번째 프래그먼트로 넘어가지 않습니다.로그를 추가해서 살펴보았는데,버튼이 아예 클릭되지 않는 것 같습니다.코드는 드라이브 링크를 남기겠습니다. 감사합니다https://drive.google.com/drive/folders/1ri7_CYyzzRrhdMA7vII7TSMJsR9AIcJE?usp=drive_link
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
3강 firebase 쓰기가 동작하질않아요
3강 첫번째 유저 데이터베이스 쓰기강의보고 firebase 회원가입해보고있는데email, pw 는 등록이 되나realtime database에는 데이터가 들어가지 않습니다 package com.example.test_1.auth import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.example.test_1.MainActivity import com.example.test_1.R import com.example.test_1.utils.FirebaseRef import com.google.android.material.textfield.TextInputEditText import com.google.firebase.FirebaseApp import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.ktx.auth import com.google.firebase.database.ktx.database import com.google.firebase.ktx.Firebase class JoinActivity: AppCompatActivity() { private val TAG = "JoinActivity" private lateinit var auth : FirebaseAuth //추후 초기화해서 사용할 변수이다 private var nickname = "" private var gender = "" private var city = "" private var age = "" private var uid = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_join) //FirebaseApp.initializeApp(this); auth = Firebase.auth var joinButton = findViewById<Button>(R.id.joinBtn) joinButton.setOnClickListener { var email = findViewById<TextInputEditText>(R.id.join_email) var pwd = findViewById<TextInputEditText>(R.id.join_pwdArea) gender = findViewById<TextInputEditText>(R.id.join_gender).text.toString() city = findViewById<TextInputEditText>(R.id.join_area).text.toString() age = findViewById<TextInputEditText>(R.id.join_age).text.toString() nickname = findViewById<TextInputEditText>(R.id.join_nickname).text.toString() // Log.d(TAG, email.text.toString()) // Log.d(TAG, pwd.text.toString()) auth.createUserWithEmailAndPassword(email.text.toString(),pwd.text.toString()) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "createUserWithEmail:success") var user = auth.currentUser uid = user?.uid.toString() // user가 null 이 아니면 toString val database = Firebase.database val myRef = database.getReference("message") myRef.setValue("Hello, World!") Log.d(TAG, "push database :success") myRef.setValue("11111111111") myRef.setValue("2222222222") //firebase 접속관련 util로 패키징 //FirebaseRef.userinfo.setValue("userinfo","hello") // val udm = UserDataModel(uid, // nickname, // age, // gender, // city) // FirebaseRef.userInfoRef.child(uid).setValue(udm) //성공시 메인으로 이동 // var intent = Intent(this, MainActivity::class.java) // startActivity(intent) } else { // If sign in fails, display a message to the user. Log.w(TAG, "createUserWithEmail:failure", task.exception) } } } } }
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
Groupy 라이브러리 지원이 되지 않습니다.
gradle에 groupie 라이브러리를 최신 버전으로 implementation 하였는데도 불구하고 이와 같이 import 되지 않습니다. github 공식 문서대로 해도 지원되지 않는데, 2022년을 마지막으로 업데이트가 없는 걸로 봐서 지원이 종료된 걸로 알고 수강을 종료해야 될까요 ?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
hibernate가 select를 두번 하는 이유
안녕하세요 강사님 강의를 들으면서 이번에 처음 JPA를 알아가고 있는 중입니다.헌데 궁금한점이 JPA 특성인것인지 아니면 H2 DB 문제인지 그것도 아니면 제 Intellij 설정 문제인지 모르겠지만 select가 두번이 되는 이유가 무엇때문이지 궁금해서 질문 드립니다. 실질적인 동작에 문제가 생기지는 않겠지만 N+1 관련 강의를 듣다보니 불필요하게 쿼리가 호출되면 안좋은것 같아 여쭈어 봅니다. @Test @DisplayName("대출 기록이 없는 유저도 응답에 포함") fun getUserLoanHistoriesTest() { //given userRepository.save(User("A",null)) //when val results = userService.getUserLoanHistories() //then assertThat(results).hasSize(1) assertThat(results[0].name).isEqualTo("A") assertThat(results[0].books).isEmpty() }위의 코드를 동작시켰을때Hibernate: insert into user (id, age, name) values (default, ?, ?) Hibernate: select user0_.id as id1_1_, user0_.age as age2_1_, user0_.name as name3_1_ from user user0_ Hibernate: select userloanhi0_.user_id as user_id4_2_0_, userloanhi0_.id as id1_2_0_, userloanhi0_.id as id1_2_1_, userloanhi0_.book_name as book_nam2_2_1_, userloanhi0_.status as status3_2_1_, userloanhi0_.user_id as user_id4_2_1_ from user_loan_history userloanhi0_ where userloanhi0_.user_id=? Hibernate: select user0_.id as id1_1_, user0_.age as age2_1_, user0_.name as name3_1_ from user user0_ Hibernate: select userloanhi0_.user_id as user_id4_2_0_, userloanhi0_.id as id1_2_0_, userloanhi0_.id as id1_2_1_, userloanhi0_.book_name as book_nam2_2_1_, userloanhi0_.status as status3_2_1_, userloanhi0_.user_id as user_id4_2_1_ from user_loan_history userloanhi0_ where userloanhi0_.user_id=? Hibernate: delete from user where id=?출력 부분에 위에 처럼 뜨는데요제가 이해한 바로는 insert는 save 때문에 한번인 반면에getUserLoanHistoreies 부분에 findAll로 한번의 쿼리를 불러오는 거라서 user와 와 userloanhistory 테이블을 각각 한번 씩 조회 해야 하지 않는가 싶어서 질문 드립니다.추가로 확인해 보보니 LEFT join에 fetch를 추가했을때 위의 select user와 user_loan_history는 left join 쿼리문으로 변한는 반면 아래의 select user와 user_loan_history는 남아 있습니다. 따로 user를 find 하는 곳이 없는 것 같은데 이런 현상이 나오는 이유가 뭘까요?.... 추측 하기로는 AfterEach로 clear할때 deleteAll을 사용해서 사용했던 테이블을 모두 select 하는건가 싶긴 한데... 제가 이해를 잘 못해서 그런건지 이부분이 어렵네요....
-
해결됨스프링은 어려워! 코틀린과 Ktor로 백엔드/서버개발 기초정복 (커피주문시스템 개발)
패키지 폴더 domain이 없네요.
안녕하세요 ktor이란 가벼운 백엔드 프로그램이 있어서 반가운 마음에 수강 신청하고 강의 듣고 있습니다. 전 개발 시에 항상 폴더경로와 패키지 경로는 같게 하고 다른 강의나 책에서도 패키지 명은 폴더를 따라 가던데 강의/소스 보니 패키지 명이 폴더를 안따라 가는거 같아서 물어봅니다. 예를 들어서 CafeMenu.kt의 파일은 com>example>model 에 있습니다. 그런데 패키지 명은 package com.example.domain.model이라고 적혀 있는데 경로에서는 domain이 없어요...그래서 패키지 명을 수정한다면 domain이 이 빠진 package com.example.model 라 작성하거나domain 폴더를 생성하는게 맞지 않나요??흠 .. 뭐 이건 방식이긴 한데 빈 프로젝트에서 시작하는게 강의 듣는데 안 헛깔렸을꺼 같은데 ... 첫 ktor 샘플인 ktor-sample-world에서 plugins가 config로 변경된거 같아서 좀 당황했어요 ^^;; 원리 아무것도 모르고 시작할 땐 그냥 강사님의 이야기를 졸졸졸 따라 가는게 학생들의 마음이라 ... 뭔가 갑작스럽게 단계를 점프하면 고민을 많이 하거든요 ...이거 폴더 변경되도 문제 없나 ... 내가 빈프로젝트를 만들어서 프로그램 코딩하는데 나도 config의 폴더를 plugins로 변경해야 돌아가는거 아니야.... 폴더명 변경했는데 안돌아가면 어떻게 하지 이런 생각이 갑자기 들었거든요 .. 어째건 저 패키지명 저렇게 해도 되나요??
-
미해결모던 안드로이드 - Jetpack Compose 입문
TodoList - 04에서 recentlyDeleteTodo가 null일 경우 처리 방법 문의
개인적으로 변수가 null일 경우변수?.let {}이렇게 사용해 왔는데요. 강의에서는 viewModelScope.launch { todoRepository.addTodo(recentlyDeleteTodo ?: return@launch) }이렇게 사용 하셨는데요. 해당 부분만 보면 뭐가 더 좋다 이럴게 없어 보이기는 하는데요. 혹시 특정한 상황에서 ?: return 으로 하는 것이 필요한(or 더 좋은) 경우가 있을까요?
-
해결됨2시간으로 끝내는 코루틴
스프링 MVC 환경에서의 코루틴
안녕하세요.Spring MVC 환경에서 코루틴을 사용할 때 질문이 있습니다. (WebFlux 사용 X)다음과 같은 코드가 있다고 가정하겠습니다. 컨트롤러@GetMapping("/test") suspend fun test(): ApiResponse<Void> { testService.run() return ApiResponse.success(statusCode = HttpStatus.OK) }서비스class TestService( private val userRepository: UserRepository, ) { suspend fun run(): Triple<String, String, Int> { // 외부 API 호출 1 val nicknameDeferred = CoroutineScope(Dispatchers.IO).async { callApiForNickname() } // 외부 API 호출 2 val addressDeferred = CoroutineScope(Dispatchers.IO).async { callApiForAddress() } // Do something business logic // DB 호출 val duplicateCount = userRepository.findDuplicateCountById(1L) return Triple(first = nicknameDeferred.await(), second = addressDeferred.await(), third = duplicateCount) } }(callApiFor~() 메소드는 외부 API 호출이라고 가정하며 suspend function입니다)서비스 레이어에서는 2개의 외부 API 호출을 수행하고 DB호출을 한 후 리턴해주는 간단한 구조입니다. 질문초기에는 내부적으로 코루틴을 사용할 지 말지 결정할 수 없는 상황이 있기에 모든 컨트롤러 메소드를 suspend로 선언하는건 어떨까 합니다. (2번 질문의 성능 차이가 크지 않다면요^^) 이 부분에 대해 강사님의 생각과 실무에서는 보통 어떻게 하는지 궁금합니다.위 질문에 이어서, 코루틴이 전혀 사용되지 않는 상황에서 컨트롤러 메소드를 suspend로 선언하면 일반 메소드로 선언하는것과 성능차이가 어느정도 있을까요? (물론 트래픽 등 기타 상황별로 다르겠지만요)서비스 레이어를 보면 CoroutineScope을 통해 각 외부 API호출별로 루트 코루틴을 따로 만들고 있습니다. 각 외부 API들은 단순 조회 요청으로써 구조적 동시성이 필요하지 않다고 생각하기 때문인데요. 실무에서도 위와 같이 여러개의 외부 API호출을 병렬로 수행해야하는 경우 각 호출마다 CoroutineScope을 사용하여 개별로 루트 코루틴을 만들어서 사용하는지 궁금합니다.일반적인 웹 API 서버 개발을 수행할 때 구조적 동시성이 필요한 케이스가 있을까요? 어차피 추후 로직을 통해 반환값에 대한 검증을 수행한다고 생각해서요. 예를 들어 A, B, C를 코루틴으로 호출할 때 A가 실패해서 B, C를 취소하려해도 각 메소드의 레이턴시에 따라 취소될수도, 이미 완료됐을수도 있을 것 같습니다. 실무에서 웹 API 비즈니스 로직 구성 시, 개별 루트 코루틴이 아닌 하나의 루트 코루틴으로 묶어서 구조적 동시성을 보장해야만 하는 상황이 있을지, 있다면 무엇일지 궁금합니다.감사합니다.
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
강사님 실시간으로 혹시 문의하는 방법은 없을까요??
시간대가 서로 안 맞는 것 같아서 오류 하나 해결하는데 너무 오랜 시간 걸리는 듯해요...
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
해당 강의 들으시는 분들 중에 교육관련해서 서로 얘기 나누실 분 있으신가요??
서로 오류나 문제발생 하는거 공유하고 서로 도움 줄 수 있는 분들 소통하고 싶습니다... 저는 FCM에서 지금 한 달째 멈춰있는데, 이전까지 했던 것에 대해서는 제가 아는 선에서 도움을 드리겠습니다.
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
강사님 FCM 단계 진행하면서 오류들이 너무 많이 발생합니다...
진도가 나가지지 않아서 막막합니다...도움이 필요합니다...오류 발생한 것에 대한 내용도 글로 정리된 링크나 안내를 실시간으로 받아볼 수 있는 방법은 없을까요?? ㅠㅠ지금 한달 내내 같은 곳에서 멈춰있는 듯해서 미칠지경입니다...한 발 더 딛고 싶은데 같은곳에서 빙빙도니까 정말 정신적으로 너무 힘이드네요.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
자료형 불일치 오류가 뜹니다
명언 앱 만들기 강의 수강 중 Type mismatch: inferred type is ViewDataBinding! but ActivityMainBinding was expected위와 같은 오류가 발생합니다. binding=DataBindingUtil.setContentView(this,R.layout.activity_main)에 빨간 밑줄이 그어집니다. package com.junho.goodwords import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import com.junho.goodwords.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) binding=DataBindingUtil.setContentView(this,R.layout.activity_main) binding.showAllSentencesBtn.setOnClickListener { val intent= Intent(this,SentenceActivity::class.java) startActivity(intent) } } }gradle 에서는 buildFeatures{ dataBinding=true viewBinding=true }로 설정하였습니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
북마크 페이지 화면이 이상하게 나옵니다.(망고)
제목에 나왔듯이 북마크 페이지에서 이미지가 나오지 않는데 어떤 페이지를 수정해야 할까요?ㅠㅠ
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
빌드가 되지 않습니다
실행하려고 하면 위와 같이 빌드에 실패했다는 말과 함께 오류가 뜹니다. 전체 폴더를 구글 드라이브에 올려두었습니다. https://drive.google.com/drive/folders/1mbyI-lZ2UKh4nxh15dJqfDuF1pAWuNP-?usp=sharing
-
해결됨스프링은 어려워! 코틀린과 Ktor로 백엔드/서버개발 기초정복 (커피주문시스템 개발)
jar 배포 시 frontend 페이지에 접속이 안되는 이슈
./gradlew buildFatJar 로 빌드한 후에jar를 실행해보니 frontend 페이지가 접속이 안되는 이슈가 있었습니다 (윈도우, 맥 환경 동일).다른 분들은 정상적으로 실행되는데 제 환경이 잘못되어서 그런지도 모르겠습니다. Routing.kt에 react 설정부분을 아래와 같이 변경하니 정상적으로 동작합니다. frontend 폴더는 ./resources 폴더로 이동시켰습니다. 어떤 문제때문에 발생한 이슈인지 강사님이나 고수님들이 조언 주시면 감사하겠습니다. 😄 [기존 코드] singlePageApplication { react("frontend") } [변경 코드] staticResources("/", "frontend") { default("index.html") preCompressed(CompressedFileType.GZIP) }