useEffect(() => { localStorage.setItem('todoData', JSON.stringify(todoData)); }, [todoData]); 이렇게 작성을 하고, 나머지는 다 주석을 처리했는데도 정상 작동하는 것 같더라구요. 하지만 의문인게 setTodoData((prev) => [...prev, newTodo]); localStorage.setItem('todoData', JSON.stringify([...todoData, newTodo])); 여기도 주석처리를 했는데, 여기는 조금 작성하는 게 다르 지 않나요? handleRemoveClick = () => { setTodoData([]) } 여기도 그렇구요. 그런데 그냥 다 정상 작동 하네요?
현재 실무에서 ORM(Prisma)을 채택해서 백엔드를 만들고 있어요. ORM으로 할 수록 Repository패턴과 조합이 좋지않다고 생각이 들고 실제 팀리더도 Repository패턴을 같이 쓰는거에 부정적이고 실제로 사용하지 않아요. 그렇다고 service 하나에 몰아 넣으니 저는 코드 읽기가 점점 힘들어지는거 같아요. 대체할만한걸 검색해보니 CQRS패턴이나 Query Object가 나오는데 아니면 서비스파일을 여러개 두거나... 강사님 같은 경우에는 실무에서 어떻게 대처하시는지 궁금합니다.
입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
안녕하세요. 크롬에서 프로그램을 열 수 없습니다. ( 11:00 ) https://github.com/bohuiKang/portfolio_bohui 아래에 에러 메시지입니다. 어떤 부분이 문제인지 찾지 못했습니다.. 어디가 문제인지 알 수 있을까요? 2024-12-12 18:14:04 2024-12-12T09:14:04.434Z INFO 1 --- [nio-8080-exec-8] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-12-12 18:14:04 2024-12-12T09:14:04.434Z WARN 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08S01 2024-12-12 18:14:04 2024-12-12T09:14:04.434Z ERROR 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Communications link failure 2024-12-12 18:14:04 2024-12-12 18:14:04 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 2024-12-12 18:14:04 2024-12-12T09:14:04.436Z WARN 1 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata 2024-12-12 18:14:04 2024-12-12 18:14:04 org.hibernate.exception.JDBCConnectionException: unable to obtain isolated JDBC connection [Communications link failure ... 2024-12-12 18:14:04 2024-12-12T09:14:04.574Z WARN 1 --- [ main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) ... 2024-12-12 18:14:21 2024-12-12T09:14:21.680Z WARN 1 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08S01 2024-12-12 18:14:21 2024-12-12T09:14:21.680Z ERROR 1 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Communications link failure 2024-12-12 18:14:21 2024-12-12 18:14:21 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 2024-12-12 18:14:21 2024-12-12T09:14:21.742Z INFO 1 --- [nio-8080-exec-1] c.b.p.a.advice.AdminApiControllerAdvice : Could not open JPA EntityManager for transaction 2024-12-12 18:14:21 2024-12-12 18:14:21 org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction ...
로그인 방식을 구현하면서, 쿠키로만 개발할 경우 완전히 백엔드에 의존하게 되어 로컬로, 동시에 키고 개발을 하지 않는이상, 도메인간 불일치를 해결 할 방법이 없어, msw를 사용해야 한다고, 이전에 말씀해주셨습니다!! 보통, 회사나, 개인 소프트웨어를 만들 때 어떤 방식으로 로그인을 주로 만드시는지 조금 알고 싶어 궁금하여 질문을 남깁니다!! 로그인 방식 고찰 로그인 성공시, accessToken을 body로 받고, refreshToken은, httpOnly 쿠키로 받는 경우 (서버에서, DB or Redis를 통해 refreshToken 관리) → 인증 필요 요청 (Bearer accessToken), 리프레시 필요 요청 (refreshToken 심긴 쿠키를 바탕으로 요청) - DB에서 관리하는 것 보다, redis를 통해 관리했을 떄 읽기 속도가 빠름을 확인! 응답: accessToken과 refreshToken 모두 body로 클라이언트에게 전달. 인증 필요 요청과, 리프레시 토큰 재발급 요청 모두 헤더의 Bearer에 accessToken이나, refreshToken을 넣어서 전달.) 현재 방식: accessToken, refreshToken 모두 쿠키로 응답받고, 요청또한, 쿠키를 포함하여 전달. 제로초님은, Next.js를 활용하여, 웹 사이트를 만드실 떄, 어떠한 방식으로 로그인을 구현하시는지 궁금하고, 많은 회사에서 사용하는 방식은 보통 어떤 방식인지도 알고싶습니다!
spi 통신에서 선생님처럼 1엣지로 설정하고 진행하였을 때 작동이 되지 않았습니다. 그래서 2엣지로 바꿔서 작동하는데 성공시켰습니다. 이런 경우는 어떤 문제가 있었던 걸까요? 그리고 hspi2의 주소를 넘길 때 static SPI_HandleTypeDef *mhspi;를 사용하셨는데 static을 제거해도 작동이 되었습니다. static의 목적에 대해서 알고 싶습니다.
섹션 8 실습 도중에 파일을 업로드 하는데 "파일 업로드를 실패 하셨습니다."라고 나옵니다. 파일 업로드에 대한 코드를 수정한것도 없는데 파일이 업로드 되지 않아서 예전에 있던 질문을 확인하였는데 제 코드는 수정되어 있어서 문제점을 찾을수가 없어서 문의남깁니다. if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) { echo("<script>alert('파일 업로드를 실패 하셨습니다.');history.back(-1);</script>"); exit; }
안녕하세요 강의 잘 듣고 있습니다 ㅎㅎ 앞선 강의에서 파티션은 늘릴 수는 있어도 줄일 수는 없다고 말씀하신 것 같은데 예시로 들으셨던 추석, 선날 등 특정 시점에 요청이 증가하는 케이스에서 컨슈머 랙이 지속적으로 증가하게 되는 것을 해결하기 위해서 파티션과 컨슈머를 증가시켜서 컨슈머 랙을 줄일 수 있겠지만 이후에 다시 요청이 줄었을 때는 이미 늘어난 파티션을 줄일 수 없는데.. 해당 해결방법 말고 다른 방법이 있는 걸까요? 아니면 늘어난 채로 계속 서비스하는 건지 궁금합니다 ㅎㅎ
안녕하세요. 2강을 수강하면서 궁금한 점이 있어 질문 글 남깁니다. VARCHAR(30) vs VARCHAR(255) 둘 중에서 데이터 타입을 선택할 때 실제 사용하는 길이만큼만 명시해 주는 게 메모리 사용 효율을 높일 수 있다고 말씀해주셨는데요. VARCHAR(30)와 VARCHAR(255) 모두 저장되는 데이터의 길이 정보 를 1 바이트(0~255 표현 가능)로 저장하는 것이 맞는걸까요? 강의 자료에 VARCHAR(30) vs VARCHAR(255) 차이를 설명할 때 '디스크 공간 효율 차이도 미미하게 존재(1바이트 vs 2바이트)'라고 적혀 있어 VARCHAR(255)에서 저장되는 데이터 길이 정보에 2바이트의 공간을 할당한다는 의미로 이해되어서요. 좋은 강의 감사합니다.
강의대로 eslint 설정한 후 { "extends" : [ "react-app" ] } npm run dev 하면 아래와 같은 에러가 납니다. VITE v6.0.3 ready in 354 ms ➜ Local: http://localhost:5173/ ➜ Network: use --host to expose ➜ press h + enter to show help 오후 4:41:35 [vite] Internal server error: C:\Dev\fullstack-app\frontend\src\main.jsx 1:1 error Parsing error: The keyword 'import' is reserved ✖ 1 problem (1 error, 0 warnings) Plugin: vite-plugin-eslint File: C:/Dev/fullstack-app/frontend/src/main.jsx at TransformPluginContext._formatError (file:///C:/%EC%94%A8%EC%97%94%ED%8B%B0%ED%85%8C%ED%81%AC/Dev/fullstack-app/frontend/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:47158:41) at TransformPluginContext.error (file:///C:/%EC%94%A8%EC%97%94%ED%8B%B0%ED%85%8C%ED%81%AC/Dev/fullstack-app/frontend/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:47153:16) at TransformPluginContext.transform (file:///C:/%EC%94%A8%EC%97%94%ED%8B%B0%ED%85%8C%ED%81%AC/Dev/fullstack-app/frontend/node_modules/vite-plugin-eslint/dist/index.mjs:1:1989) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async EnvironmentPluginContainer.transform (file:///C:/%EC%94%A8%EC%97%94%ED%8B%B0%ED%85%8C%ED%81%AC/Dev/fullstack-app/frontend/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:47001:18) at async loadAndTransform (file:///C:/%EC%94%A8%EC%97%94%ED%8B%B0%ED%85%8C%ED%81%AC/Dev/fullstack-app/frontend/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:40852:27) 오후 4:41:35 [vite] Pre-transform error: C:\Dev\fullstack-app\frontend\src\main.jsx 1:1 error Parsing error: The keyword 'import' is reserved 파싱 오류 같은데 어느 설정파일을 수정해야 할까요?
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, coroutine 강의를 듣고 ktor server 공부를 하는 중에 delay 관련 질의가 생겨 글 남깁니다. delay 의 경우 coroutine 이 스레드를 양보하고, 일정 시간 후에 다시 스레드가 비어있으면 점유하는 형식으로 진행될텐데, 아래와 같은 경우 delay 이후 코드가 실행되지 않습니다. 사용자 → KTOR Server → suspend function call → loop { logic → 너무 많은 동작을 제한하기위한 delay } ktor 는 기본적으로 요청이 IO Dispatcher 를 사용하는 것 같은데, coroutine 에서 delay 이후 기능이 동작하지 않는 것에 대한 이유가 있을까요..? (강의랑 무관한 내용이라 죄송합니다 ㅠ.ㅠ) /* Routing.kt */ fun Application.configureRouting(searcher: BaseSearcher) { routing { post("/search") { val params = call.receive<Map<String, String>>() searcher.logging("Received POST request with params: $params") val result: List<BaseDTO> = searcher.search(params) searcher.logging("POST Result: $result") call.respond(HttpStatusCode.OK, mapOf("result" to result)) } get("/") { call.respondText("Hello World!") } } } /* Searcher.kt */ /** * 함수 이름 : search * 내용 설명 : 입력된 map<string, string> param 을 바탕으로 요청 전송 및 응답 반환 */ override suspend fun search(searchParam: Map<String, String>): List<SimpleSearchLandResultDTO> { // 별도의 Job 으로 분리해서 오류시 상위 전파 제한 return HttpClient(CIO).use { client -> val parseResultLst: MutableList<SimpleSearchLandResultDTO> = mutableListOf() try { val initRequestResultDto: SimpleSearchResultDTO = sendFormedRequest(client, SearcherConst.URL_MAIN_PAGE, false) // 기본 페이지 요청이 성공했을 때 다음 요청을 진행 if (initRequestResultDto.isSuccess) { val mutableSearchParam = searchParam.toMutableMap() delay(300) while (true) { val eachPageSearchResultDto: SimpleSearchResultDTO = sendFormedRequest(client, makeGetUrl(mutableSearchParam), true) // 실패한 경우 종료 if (!eachPageSearchResultDto.isSuccess) { logging("[search] 조회 중 오류가 발생하였습니다.") break } // 결과가 빈 경우도 종료 else if (eachPageSearchResultDto.landSearchResultLst.isEmpty()) { break } // 결과가 있는 경우엔 전부 더해줌 parseResultLst.addAll(eachPageSearchResultDto.landSearchResultLst) logging("[search] result(${eachPageSearchResultDto.landSearchResultLst[0].currentPage} : ${eachPageSearchResultDto.landSearchResultLst}") // 마지막 페이지인 경우 종료 if (eachPageSearchResultDto.landSearchResultLst[0].currentPage == eachPageSearchResultDto.landSearchResultLst[0].maxPage ) { break } else { // 다음 페이지 수집 진행 mutableSearchParam["currentPage"] = (eachPageSearchResultDto.landSearchResultLst[0].currentPage + 1).toString() delay(300) } } } } catch (e: Exception) { logging("[search] search 함수 중 오류가 발생하였습니다. param: $searchParam, exception: $e") } logging("[search] Result : $parseResultLst") // parseResultLst 반환 parseResultLst } } private suspend fun sendFormedRequest(client: HttpClient, url: String, isResultNeed: Boolean): SimpleSearchResultDTO { return try { val response = client.get(url) { headers { append(HttpHeaders.Cookie, cookie.toCookieString()) append(HttpHeaders.Accept, SearcherConst.DEFAULT_HTTP_ACCEPT) append(HttpHeaders.AcceptEncoding, SearcherConst.DEFAULT_HTTP_ACCEPT_ENCODING) append(HttpHeaders.Connection, SearcherConst.DEFAULT_HTTP_CONNECTION) append(HttpHeaders.AcceptLanguage, SearcherConst.DEFAULT_HTTP_ACCEPT_LANGUAGE) append(HttpHeaders.UserAgent, SearcherConst.DEFAULT_HTTP_USER_AGENT) } } cookie.putAll(response.headers[HttpHeaders.SetCookie]?.split(";")?.map { it.split("=") }?. filter { it.size == 2 }?.filter { it[1] != "/" && it[1].isNotEmpty() }?.associate { it[0] to it[1] } ?: mapOf()) if (response.status != HttpStatusCode.OK) { SimpleSearchResultDTO(false) } else { SimpleSearchResultDTO(true, if(isResultNeed) parseData(response.bodyAsText()) else mutableListOf()) } } catch(e: Exception) { logging("[sendFormedRequest] Error : $e", Level.ERROR) SimpleSearchResultDTO(false) } }
안녕하세요 강의 설명이 너무 좋아 잘 따라가고있습니다ㅎㅎ 저는 Docker + Spring Boot로 배포 자동화 시키는게 목표입니다! 문제는 기존에 로컬 DB 연결로 테스트 코드를 작성했었는데요!(개인 프젝) 이 때문에 빌드가 안되다보니 따라가는데 조금 어려움이 있었습니다..! EC2안에 도커로 DB 띄워서 해결해야만 할 것 같은데 이렇게 해도 Docker+Spring Boot 목차를 따라가는데 문제 없을까요? 테스트 파일을 삭제하고 싶진 않아서요!! 다른 좋은 방법이 있으시다면 알려주시면 감사하겠습니다!
게임 개발자를 위한 3D 그래픽스, 쉐이더, OpenGL (6) - 쉐이딩 기초, 퐁 리플렉션 모델, 블린-퐁 쉐이딩
학습 관련 질문 ❓ 을 남겨주세요. 상세히 작성하면 더 좋아요! 출장이 잦아서, ✍ 답변에 시간이 좀 걸릴 수는 있습니다. 양해 바랍니다. 🏃 안녕하세요, 강의를 듣고 직접 구현해보며 연습중인데 한 가지 궁금한게 생겨 질문 드립니다. 앞서 진행했던 강의의 vertex shader와 마찬가지로, z-negate 를 해주어야한다고 생각해서 버텍스 쉐이더에서 vPos를 구하고 vPos.z *= -1 을 해주고 있었습니다. 하지만 강의 소스코드에는 이 negate해주는 부분이 없는게 왜인지 잘 모르겠습니다. 강의 소스코드에는 C++ 코드 상에서 negate되어지는 부분이 있는걸까요? 저는 negate하지 않으면 아래와 같은 결과로 렌더링됩니다. vertex shader에서 z-negate하면 잘 나옵니다. #version 410 core struct Light { vec4 position; vec4 ambient; vec4 diffuse; vec4 specular; vec4 att; }; struct Material { vec4 ambient; vec4 diffuse; vec4 specular; float shineness; }; in vec4 aPos; in vec4 aNorm; uniform mat4 uMat; uniform Light light; uniform Material material; out vec4 vColor; void main() { vec4 vPos = uMat * aPos; vec4 vNorm = transpose(inverse(uMat)) * aNorm; vec3 N = normalize(vNorm.xyz); vec3 L = normalize(light.position.xyz - vPos.xyz); vec3 V = vec3(0.0f, 0.0f, 1.0f); vec3 R = reflect(-L,N); vec4 ambient = light.ambient * material.ambient; float d = length(light.position.xyz - vPos.xyz); float denom = light.att.x + light.att.y * d + light.att.z * d * d; vec4 diffuse = max(dot(L,N), 0.0) * light.diffuse * material.diffuse / denom; vec4 specular = pow(max(dot(R, V), 0.0), material.shineness) * light.specular * material.specular / denom; vColor = ambient + diffuse + specular; vPos.z *= -1; gl_Position = vPos; }