묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
C#으로 DB를 만든다음에 어떻게 외부에서 사용하나요??
이런식으로 데이터를 만들고 EC2 컴퓨터에다가 이 데이터를 옮기거나 하는 방법이 있나요?제 생각은 만든 파일을 메세지나 S3에 끌어다 넣고 올리는줄 알았는데상위 폴더를 열어서 파일을 가져갈까 생각해 봤는데 열수가 없다고 해요SQL Server 폴더에 들어가려고 해도 경로를 주지를 않아서만약에 이 데이터를 만든 걸 다른 곳에서 사용하고 싶을 때는 어떻게 해요 하나요? ㅜㅜ
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
when 에서 early return 관련
안녕하세요! 이해가 쏙쏙 되도록 강의를 잘 해주셔서 정말 잘 듣고 있습니다."5강. 코틀린에서 제어문을 다루는 방법" 에서 궁금한 점이 있어 질문 드립니다.when (값) 에서 값을 생략하면 ealry return 처럼 동작한다고 설명해주셨는데, 실제 코드를 수행하면 그렇게 동작하지 않는 것 같네요.아래와 같이 println("xxx") 를 추가했을 때 early return 이라면 해당 코드가 동작하지 않아야 되는데 동작을 합니다.fun judgeNumber2(number: Int) { when { number == 0 -> {} number % 2 == 0 -> println("주어진 숫자는 짝수입니다") else -> println("주어지는 숫자는 홀수입니다") } println("이 코드가 동작하나요?") }실제 early return 으로 동작하려면 아래와 같이 when expression 을 통째로 return 해야 가능해 보입니다.이렇게 하면 맨 아래 코드가 intellij 에서는 unreachable code 라고 뜨네요.fun judgeNumber2(number: Int) { return when { number == 0 -> {} number % 2 == 0 -> println("주어진 숫자는 짝수입니다") else -> println("주어지는 숫자는 홀수입니다") } println("이 코드가 동작하나요?") }혹시 제가 잘못 이해하고 있는 것인지 답변 부탁 드릴게요~~ ^^
-
미해결쉽고 빠르게 익히는 Power BI 심화 1 (시각화와 파워 쿼리)
Key 설정 및 중복값 부여 문의
안녕하세요. Alteryx로 데이터 분석한 내역을 Power BI로 옮겨서 시각화를 활용하고자 하는데요. 전환하는 과정에서 두가지 질문이 있어서 문의드립니다.Join Key 설정: 필드 A(날짜), B(문자), C(금액) 조합을 Key로 설정하고 싶은데, 설정하는 방법이 궁금합니다. 단순히 세개 필드를 합치는거 error가 발생하더라구요. 중복값 부여 (필드 D 생성): 1번의 Join Key 별로 중복값을 부여하여(0 부터 n까지) 중복값을 고유값으로 바꾸고 싶습니다. 왜냐하면 대사시 중복값 부여한 것 까지 Join Key로 사용하려고 합니다. Variable을 쓰면 될 것 같지만 정확하게 어떻게 써야할지 답변 주시면 감사하겠습니다. 최종 대사 Key: 1과 2를 거친 후 필드 A, B, C, D를 이용하여 두개의 테이블 쿼리 병합을 하려고 합니다.감사합니다.
-
미해결애플 웹사이트 인터랙션 클론!
클래스 바로 입력하는 방법
- 질문에 대한 답변은 강의자가 하는 경우도 있고, 수강생 여러분들이 해주시는 경우도 있습니다. 같이 도와가며 공부해요! :)- 작성하신 소스코드 자체의 오류보다는, 개념이나 원리가 이해되지 않는 부분을 질문해주시는게 좋습니다. 그대로 따라했는데 소스코드에서 버그가 나는 경우는 99%가 오타에 의한거라서, 완성된 소스랑 찬찬히 비교해보시면 직접 찾으실 수 있을 거예요. 개발자도구 console에 오류로 표시된 부분만 완성 코드에서 복사->붙여넣기를 해보시는 것도 방법입니다.- 먼저 유사한 질문이 있었는지 검색해보세요.- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 섹션1. 웹페이지 골격 만들기 > 페이지 내용 HTML 작성 강의 내1:58 쯤에 클래스 바로 작성하는 부분이 있는데요. 이렇게 입력하려면 어떻게 해야하나요?검색 키워드도 모르겠어서 질문합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의에 있는 내용 그대로 입력하였는데 v3가 안열리네요
[질문 내용]여기에 질문 내용을 남겨주세요.localhost:8080/front-controller/v3/members/new-form 주소로 들어가보니 실행이 안되네요 왜 그런걸까요 구글 드라이브 주소 올려 드려요 https://drive.google.com/drive/folders/1DmiETYFjQvDDv2hOmNS4iu6w_y60Srws?usp=share_link
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
github 권한 요청드립니다
인프런 아이디 : studygoodsoft@gmail.com깃헙 아이디 : ldh2724@naver.com깃헙 Username : ldh2724github 권한 요청드립니다.
-
해결됨스프링 핵심 원리 - 기본편
궁금한 게 있는데요.
후반부에 좀 이해가 안 가는 게 있어서 복습 겸 앞부분 보고 있습니다. 그런데 분명 멤버 리포지토리와 멤버 서비스의 저장요소는 결국 save와 join이 담당을 하게 되는 건데, 굳이 이름을 join이라고 한 이유가 있나요? 사실 save라고 해도 잘 동작을 하는데, 굳이 이름을 join으로 바꿔서 한 이유가 무엇인가요? 사실 초반에 그것때문에 굉장히 햇갈렸거든요. 이제 와서 궁금증이 생겨서 질문드립니다.
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
React.memo / useEffect 차이점,쓰는 용도
안녕하세요. 정환님수업내용 중 궁금한게 있어서 글을 씁니다.이전에 useEffect를 사용하여, 적용했을때도 똑같은 결과값이 나오는데, React.memo로 고차함수를 이용해 만드는 것보다, useEffect에 [] 값을 넣어서 사용해주는게 더 간단하고 쉬워보이는데.. React.memo와 useEffect의 차이점이나, 쓰이는 용도가 따로있나요? 두개의 차이점이 있는지 확인부탁드립니다.const CounterB = ({obj}) => { useEffect(()=>{ console.log(`CounterB Update - count : ${obj.count}`) }, [obj.count]) return <div>{obj.count}</div> }
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
가시성 제어
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 11강 강의를 듣던중 궁금증이 생겨질문을 하게 되었습니다 1분 51초 "kotlin에서는 패키지를 namespace를 관리하기 위한 용도로만 사용! 가시성 제어에는 사용되지 않는다"라고 하셨는데! 이 말에는 "자바는 package를 가시성 제어로 사용한다"라는 의미가 내포되어 있는듯해서 질문을 하게되었습니다. 혹시 자바에서 package를 가시성 제어로 사용하는 경우가 있을까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
곳감 문제 시간복잡도에 관해서
이 문제를 시간복잡도를 생각해서 다르게 풀었는데 그 판단이 맞는지 질문드립니다.우선 저의 코드는 다음과 같습니다.def solution(): # setting sys.stdin = open('problem_8.txt', 'rt') # inputs n = int(input()) area: List[List[int]] = [list(map(int, input().split())) for _ in range(n)] m = int(input()) rotations: List[List[int]] = [list(map(int, input().split())) for _ in range(m)] # process for rotation in rotations: row_num: int = rotation[0] direction: int = rotation[1] step = rotation[2] row = area[row_num - 1] step = step if direction == 0 else -step left = row[step:] right = row[:step] area[row_num - 1] = left + right deviation: int = 0 summation: int = 0 for row_num in range(n): for column_num in range(0 + deviation, n - deviation): # 04 13 22 summation += area[row_num][column_num] if row_num < n // 2: deviation += 1 else: deviation -= 1 # output print(summation) TimeCounterRunner(solution).run()저는 슬라이싱 기능을 이용해서 했는데 이렇게 한 이유는 리스트의 pop에 파라미터를 안넘기면 시간복잡도가 1이지만 제가 알기로 파라미터가 있는 경우 N이 되는 것으로 알고 있습니다.거기에 추가로 pop은 루프를 돌면서 해야하기 때문에 N^2가 된다고 생각했습니다.거기에 회전 숫자가 1인 경우에는 insert를 써야하는데 이것도 시간복잡도가 N으로 되는 것으로 알고 있었습니다.그러면 어림잡아서 시간복잡도가 라인도 읽어야 하니까 N^3이 되는 것 같아서 저같은 경우 위에처럼 하면슬라이싱에서 N이고 리스트를 더하는 것이 제가 알기론 시간복잡도가 N이긴 하지만 중첩으로 가지 않아서 N^2로 끝날 수 있을 것 같았는데 맞는 판단인지 알고 싶습니다.
-
미해결처음 배우는 리액트 네이티브
코드 좀 봐주세요 버튼 두개가 생성이 안되요
같은 src 디랙토리 안에 안에 있는 두개의 화일TouchableOpacity onPress 로 mubutton 컴포넌트 만드는 코드인데요 mybutton.js 화일 코드++++++++++++++++++++++++++++++++import { StatusBar } from "expo-status-bar"; import { StyleSheet, Text, View, TouchableOpacity } from "react-native"; const mybutton = () => { return ( <TouchableOpacity onPress={() => alert("클릭하세요")}> <view style={{ backgroundColor: "red", padding: 10, margin: 100 }}> <text style={{ fontsize: 20, color: "blue" }}> My button</text> </view> </TouchableOpacity> ); }; export default mybutton; App.js 화일 코드 +++++++++++++++++++++++++++++++import { StatusBar } from "expo-status-bar"; import { StyleSheet, Text, View, Button } from "react-native"; import mybutton from "./mybutton"; export default function App() { return ( <View style={styles.container}> <Text>~!!!!!!~~Open up App.js to start working on your app!</Text> <StatusBar style="auto" /> <br></br> <Button title="Button" onPress={() => alert("입력하세요!!")} /> <mybutton /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: "#fff", alignItems: "center", justifyContent: "center", }, });
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
관계 쿼리 질문입니다
위의 코드는 제로초님께서 예시로 설명해주신 코드입니다.사용자 데이터베이스와 연결된 댓글 데이터베이스에서 아이디가 1인 댓글의 아이디와, 사용자를 불러오는 쿼리로 이해하고 있습니다. 이것은 제가 작성한 쿼리입니다.의도한 의미는 다음과 같습니다사용자중에서, 현재 req의 저장된 id와 일치하는 사용자를 찾고, 그 사용자와 함께 그 사람의 following관계에 있는 데이터를 불러온다.그러나 실행하면, followings를 찾을 수 없다는 오류가 나옵니다. 사실 뭐가 문제인지 모르겠는데, 혹시 위와 같이 include해서 관계 쿼리를 사용할때, where을 include 밖에 작성하면 안되는 것인가요?그렇다면 제로초 남께서 설명해주신 관계쿼리의 다른 방법으로먼저 사용자를 불러오고,user.getFollowings 을통해서 following 관계에 있는 사람들을 불러와야 하는 것인가요?위와 같은 구현을 하고자 할때, user.getFollowing을 사용하지 않고, include를 통해서 쿼리를 작성할 수 있다면 코드를 알려주시면 감사하겠습니다
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
페이지구현-홈 부분에서 compare 부분이 잘 이해가 안갑니다.
페이지구현-홈 27:07 다 완성되어있는 getProcessedDiaryList 함수의 안에 들어있는 compare 함수가 어떤원리로 정렬을하게되는건지 전체적으로 잘 이해가 가지 않습니다..ㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
temp 주소값 push 시 질문 있습니다.
안녕하세요. 대략적인 진행 방식은 어느정도 이해가 된 것 같습니다. 그런데 지역변수(temp) 할당 시에 매개변수에(&temp)값이 들어가는 부분을 도저히 찾을 수가 없네요 ㅠㅠ혹시 CreatePlayer가 호출되기 전 push eax 부분이 매개변수까지 동시에 지정이 된다는 뜻일까요?? 나머지 부분은 반복 학습을 하니 이해가 가는데 임시 저장소 생성시점만 이해가 가질 않습니다 ㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제4 - 상속관계 매핑 13:20 새로 질문합니다.
스프링으로 새로 프로젝트 만들었습니다.영상에서 나오는 환경과 똑같이 따라했고요.현재 테이블 생성과 인서트 쿼리가 나오질 않고 있습니다ㅜㅜ 깃허브 링크입니다.https://github.com/InSuChoe/jpashop_test
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
빈 배열 선언시 never가 아닌 any[] 타입으로 나옵니다.
위 이미지처럼 나오는데, 설정 차이에 의한 것인지 검색을 해 보아도 알 수가 없네요.혹시 답변을 구할 수 있을가 싶어 질문 드립니다.
-
미해결웹게임을 만들며 배우는 인터렉티브웹! JAVASCRIPT
frame 질문합니다.
요즘 모니터가 거의다 144hz 인데 수업에서는 60hz를 기준으로 잡고 하시더라구요 144 모니터에서 실행 시킬경우 케릭터가 너무 빨리 달리는것 처럼 모션이 보이는데 이경우는 어떻게 60fps로 고정을 할 수 있나요
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
1. 라우터 연결 오류 2. req.response가 undefined
수정 전 코드에서는 다음과 같은 오류가 뜨면서 라우터 연결이 안됩니다.GET /v1/posts/my 라우터가 없습니다.(1-1) 수정 전 nodebird-api의 app.jsconst express = require("express"); const path = require("path"); const cookieParser = require("cookie-parser"); const passport = require("passport"); const morgan = require("morgan"); const session = require("express-session"); const nunjucks = require("nunjucks"); const dotenv = require("dotenv"); dotenv.config(); const v1 = require("./routes/v1"); const authRouter = require("./routes/auth"); const indexRouter = require("./routes"); const { sequelize } = require("./models"); const passportConfig = require("./passport"); const app = express(); passportConfig(); app.set("port", process.env.PORT || 8002); app.set("view engine", "html"); nunjucks.configure("views", { express: app, watch: true, }); sequelize .sync({ force: false }) .then(() => { console.log("데이터베이스 연결 성공"); }) .catch((err) => { console.error(err); }); app.use(morgan("dev")); app.use(express.static(path.join(__dirname, "public"))); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, }, }) ); app.use(passport.initialize()); app.use(passport.session()); app.use("/v1", v1); app.use("/auth", authRouter); app.use("/", indexRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== "production" ? err : {}; res.status(err.status || 500); res.render("error"); }); app.listen(app.get("port"), () => { console.log(app.get("port"), "번 포트에서 대기중"); }); (2-2) 수정 후 nodebird-api의 app.jsconst express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const passport = require('passport'); const morgan = require('morgan'); const session = require('express-session'); const nunjucks = require('nunjucks'); const dotenv = require('dotenv'); dotenv.config(); const v1 = require('./routes/v1'); const v2 = require('./routes/v2'); const authRouter = require('./routes/auth'); const indexRouter = require('./routes'); const { sequelize } = require('./models'); const passportConfig = require('./passport'); const app = express(); passportConfig(); app.set('port', process.env.PORT || 8002); app.set('view engine', 'html'); nunjucks.configure('views', { express: app, watch: true, }); sequelize.sync({ force: false }) .then(() => { console.log('데이터베이스 연결 성공'); }) .catch((err) => { console.error(err); }); app.use(morgan('dev')); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use(session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, }, })); app.use(passport.initialize()); app.use(passport.session()); app.use('/v1', v1); app.use('/v2', v2); app.use('/auth', authRouter); app.use('/', indexRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); }); app.listen(app.get('port'), () => { console.log(app.get('port'), '번 포트에서 대기중'); }); 수정 후에는 에러 메시지가 Cannot read properties of undefined (reading 'status')로 바뀌었습니다. nodecat의 index.jsconst express = require("express"); const axios = require("axios"); const router = express.Router(); const URL = "http://localhost:8002/v1"; axios.defaults.headers.origin = "http://localhost:4000"; const request = async (req, api) => { try { if (!req.session.jwt) { const tokenResult = await axios.post(`${URL}/token`, { clientSecret: process.env.CLIENT_SECRET, }); req.session.jwt = tokenResult.data.token; return await axios.get(`${URL}${api}`, { headers: { authorization: req.session.jwt }, }); } } catch (error) { console.error(error); if (error.response.status === 419) { delete req.session.jwt; return request(req, api); } return error.response; } }; router.get("/mypost", async (req, res, next) => { try { const result = await request(req, "/posts/my"); res.json(result.data); } catch (error) { console.error(error); next(error); } }); router.get("/search/:hashtag", async (req, res, next) => { try { const result = await request( req, `/posts/hashtag/${encodeURIComponent(req.params.hashtag)}` ); res.json(result.data); } catch (error) { console.error(error); next(error); } }); module.exports = router; nodebird-api의 middleware.jsconst jwt = require("jsonwebtoken"); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(403).send("로그인 필요"); } }; exports.isNotLoggedIn = (req, res, next) => { if (!req.isAuthenticated()) { next(); } else { res.redirect("/"); } }; exports.verifyToken = (req, res, next) => { try { req.decoded = jwt.verify(req.headers.authorization, process.env.JWT_SECRET); // req.headers.authorization 유효한지 검사. // jwt토큰을 검증해서 req.decoded에 payload(데이터)부분이 담긴다. return next(); } catch (error) { if (error.name === "TokenExpiredError") { // 유효기간 초과. return res.status(419).json({ code: 419, // 2xx 3xx 4xx 5xx같이 앞자리만 용도에 맞으면 이후 값은 마음대로 정해도 된다. // 문서화만 제대로 하면 됨. message: "토큰이 만료되었습니다", }); } return res.status(401).json({ // 위조한 토큰인 경우. code: 401, message: "유효하지 않은 토큰입니다", }); } }; nodebird-api의 v1.jsconst express = require("express"); const jwt = require("jsonwebtoken"); // api서버이기 때문에 nodebird에서 요청자에게로 정보를 제공할 라우터를 뚫어줘야 한다. // 요청을 처리할 수 있는 라우터. const { verifyToken } = require("./middlewares"); const { Domain, User, Post, Hashtag } = require("../models"); const router = express.Router(); router.post("/token", async (req, res) => { // 토큰을 발급해주는 라우터. const { clientSecret } = req.body; try { const domain = await Domain.findOne({ // 도메인 등록했는지 검사. where: { clientSecret }, // nodecat의 .env에 있는 CLIENT_SECRET값이 // 도메인 clientSecret 등록되어있는지 검사. include: { model: User, attribute: ["nick", "id"], }, }); if (!domain) { // 도메인 등록 안되어있으면 에러. return res.status(401).json({ code: 401, message: "등록되지 않은 도메인입니다. 먼저 도메인을 등록하세요", }); } const token = jwt.sign( // 토큰 발급해주기 .sign() // 도메인 등록 되어 있으면 토큰 발급 해주기. { id: domain.User.id, nick: domain.User.nick, // - 부가적 데이터 넣어줌. }, process.env.JWT_SECRET, // - signiture 만들어줌 위조 검사. { expiresIn: "1m", // 유효기간 1분. issuer: "nodebird", // 누가 발급해줬는가. // - 토큰 옵션 } ); return res.json({ // 토큰 발급되면 nodecat에 돌려줌. // nodecat의 index.js의 tokenResult.data.token에 저장됨. code: 200, message: "토큰이 발급되었습니다", token, }); } catch (error) { console.error(error); return res.status(500).json({ code: 500, message: "서버 에러", }); } }); router.get("/test", verifyToken, (req, res) => { // 토큰이 제대로 발급되었는지 테스트 하는 라우터. res.json(req.decoded); // req.decoded는 verifyToken에서 나옴. // 이후 req.decoded는 nodecat의 index.js의 result.data안에 들어간다. }); // nodebird의 data들을 보내주는 라우터 코딩. router.get("./posts/my", verifyToken, (req, res) => { // 자기 자신의 정보를 가져올 수 있게 해주는것. Post.findAll({ where: { userId: req.decoded.id } }) .then((posts) => { console.log(posts); // async await 방식이 아니라 post방식으로 작성됨. res.json({ code: 200, payload: posts, // 코드와 데이터를 규격에 맞춰 보내줌. }); }) .catch((error) => { // 비동기 처리를 할때는 에러가 뭔지 기록해주어야 한다. console.error(error); return res.status(500).json({ code: 500, message: "서버 에러", }); }); }); // 해시태그로 검색하는 라우터 router.get(`/posts/hashtag/:title`, verifyToken, async (req, res) => { try { const hashtag = await Hashtag.findOne({ where: { title: req.params.title }, }); if (!hashtag) { return res.status(404).json({ code: 404, message: "검색 결과가 없습니다.", }); } const posts = await hashtag.getPosts(); return res.json({ code: 200, payload: posts, }); } catch (error) { console.error(error); return res.status(500).json({ code: 500, message: "서버 에러", }); } }); module.exports = router; 질문 1. 수정 후 코드는 10.7의 코드는 붙여 넣기 한 것입니다. 수정 전에도 라우터는 연결된 것처럼 보였는데 라우터가 없다는 오류가 뜬 이유가 뭔가요? 질문 2. 수정 후에 뜨는 에러 메시지인 Cannot read properties of undefined (reading 'status')가 if (error.response.status === 419) { // 토큰 만료 시 토큰 재발급 받기 이 부분에서 발생했습니다. error.response가 undefined라는 것 까지는 알겠는데 2-1. 왜 error.response가 undefined가 된것인지.2-2. 어느 부분에서 오류가 발생해 error로 넘어간 것인지 전혀 감이 잡히지 않습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@RequestBody와 BindingResult 질문입니다
안녕하세요@RequestBody로 JSON 데이터를 매핑할 때 타입 에러가 발생하여 매핑이 실패하면 BindingResult가 있음에도 예외가 터지고 그냥 마무리 되는데요, @RequestBody로 받은 JSON 데이터는 바인딩 실패를 코드 상에서 제어할 수 있는 방법이 따로 없나요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
데이터 바인딩 이용시 <layout>
데이터 바인딩 이용시 activity_main.xml 전체를 <layout>으로 감싸주는 이유가 무엇인가요?