묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티설계질문입니다.
강의 잘봤습니다!! 역시 꿀강의!!! 배운 것을 토대로 토이프로젝트를 간단하게 진행 해보려고 합니다. 그래서 팁좀 받을 수 있을까... 해서요!!! 요구사항은 이렇습니다. - 회원엔티티는 본인의 플레이리스트 엔티티를 조회한다. - 플레이리스트의 정보는 동영상 엔티티에 저장되어 있다. - 회원은 본인의 플레이리스트 목록을 삭제할 수 있다. - 회원은 본인의 플레이리스트 중 가장많이 들은 곡 리스트를 조회할 수 있다. - 모든 사용자는 동영상 엔티티에 있는 모든 곡 중 가장 많이 들은 곡 리스트를 조회할 수 있다. 위와 같은 결과로 아래와 같이 설계하였습니다. 가능하시다면 피드백 가능할까요 ㅜ.ㅜ @Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @OneToMany(mappedBy = "member") private List<PlayList> playList = new ArrayList<>();} @Entitypublic class Video { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @Column(name = "video_no") private String videoNo; private String image; private int count; // 재생 횟수} @Entitypublic class PlayList { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private int count; // 재생 수 @ManyToOne @JoinColumn(name = "member_id") private Member member; @ManyToOne @JoinColumn(name = "video_id") private Video video;}
-
미해결벡터 미적분학 시리즈2 - 미분 심화: 최적화 이론의 기초와 벡터 함수
3.4단원 (c)의 25:50 부분 quiz에서 질문드립니다.
안녕하세요, 선생님 3.4단원 (c)의 25:50 quiz 의 힌트 관련해서 문의드립니다. S = xy + yz + zx - 5 = 0 일 때, x -> 0 이나 x -> 무한대일 때, xyz -> 으로 가는 것을 보일 때, (1+epsilon)^(1/2) 테일러정리를 사용한다고 하셨는데, 어떤 부분에서 이 정리를 사용해야 될지 감이 안 잡혀서 문의드립니다. x -> 무한대일 때, y, z -> 0인 것을 보일 때 쓰는건지요? 스타벅스 기프티콘을 받고 싶었지만, 도저히 헷갈려서 문의드립니다. ㅠ
-
미해결정말 쉽게 풀어보는 코딩 테스트 top 기본 문제 (with 자바)
참조값 차이 문의드립니다.
p = p.next; 위의 코드 바로 다음에 아래처럼 로그를 출력하면 전 p 와 p.next의 참조값이 동일하게 나올거라 생각했는데 다르게 나옵니다. 제가 잘못이해하고 있는걸까요? System.out.println("\n p2:"+ p + " / p.next:"+ p.next ); 테스트로 아래처럼 해보면 ListNode tmpP = p; ListNode tmpP2 = p.next; tmpP 와 p tmpP2 와 p.next는 각각 서로 같고 두쌍은 서로 다릅니다. ListNode tmpP2 = p.next; 가 tmpP2 와 p.next 가 같으므로 당연히 p = p.next 의 p와 p.next도 같아야된다고 생각하느데 다른 참조값이 나옵니다. (결과는 정상적으로 나옵니다) 추가로 체크해봤는데 p.next = node; p = p.next; 에서 아래 처럼 둘은 참조값이 같네요 p.next == node.next; p == node. 혹심 몰라 말씀드립니다
-
미해결성공적인 SQL 인젝션 공격을 위한, SQL 기본 문법
char(); 질문이 있습니다.
동일한 질문글을 보았으나 혹시나 해서 질문글 올립니다. 저 또한 select char(97);을 입력 시 0x61이 출력되는데 이후에 배우는 것들에 큰 차질을 빚게되나요? 해결할 순 없을까요?
-
미해결눈떠보니 코딩테스트 전날
유레카 문제풀이
유레카문제풀이에서 충분히 할 수 있을거라고 하면서 끝맺음이 나는데... 끝까지 문제풀이를 해주셨으면 합니다.ㅠ부탁드립니다.
-
미해결예제로 배우는 스프링 입문 (개정판)
9분 쯤 불들어오는 아이콘은 인텔리 버전에따라 보이나요?
.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
질문
캐릭터 시선으로 바라보는 축이 Local 인데 강의에서 45도 정도 로테이션 한상태로 캐릭터를 움직이면 글로벌축으로 움직여서 캐릭터시선으로 움직임을 주려고 다이렉션을 줬는데 , 주석에서 트랜스폼 다이렉션은 Local -> World 라고 하셨는데 혼동이 옵니다 World 와 Global 다른가요 ? 로컬이 캐릭터 시선이 아닌가요?
-
해결됨리액트로 나만의 블로그 만들기(MERN Stack)
선생님 질문이 있습니다~!
강의 14:20 즈음, server/routes/api/post.js 작성 중에, 87번 코드와, 103번 코드에서 약간에 차이가 보이는 듯 한데, 다른 코드와는 다르게 유독 103번 줄에는 await Post.findByIdAndUpdate(newPost._id, { $push: { } 없이, category: findResult._id }) 이렇게 코딩이 되어있는데, 혹시 $push: {} 없이 작성을 하더라도 나중에 완성되고 나서 작동하는데는 문제가 없나용~? (항상 잘 수강하고 있습니다 친절한 강의 감사드려요~~^^)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
save Method 질문
public Member save(Member member) { // SimpleJdbcInsert는 SQL문을 대체함 (Insert SQL 문을 구성하는 테이블명, PK , 필드명은 필요함) SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id"); Map<String, Object> parameters = new HashMap<>(); parameters.put("name", member.getName()); Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters)); member.setId(key.longValue()); return member;} SimpleJdbcInsert의 동작방식이 이해가 가지 않습니다.member.setId(key.longValue()) 에서멤버에 ID 값을 세팅한 것은 이해가되는데setName은 어떻게했는지 이해가 가지 않습니다.
-
미해결정말 쉽게 풀어보는 코딩 테스트 top 기본 문제 (with 자바)
다른 풀이 문의드립니다
LinkedList 이해하려니 머리가 깨지네요 ㅎㅎ 이해는 했는데 이 문제가 사실 다 배열에 넣어서 그냥 큰 순서대로 소팅해도 되는것 같던데 그랗게하면 점수를 낮게 받을까요? 그렇게 풀면 안되는 이유가있을까요? 점수가 낮다면 그것만으로도 이유가 될거란건 수긍합니다 시험이니깐요 배열에 다넣어서 소트하는게 시간복잡도도 더 효율적인것 같은데요 지금 다시 leetcode에서 문제보니 LinkedList로 최종결과를 리턴하도록 강제하고있네요
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
Route.get() requires a callback function but got a [object Object]
인자를 객체로 넘겼다고 에러가 뜨는데, auth를 구현하는 app.get에서 자꾸 문제가 있다고 합니다. 오타는 도저히 못찾겠는데,, 문제가 무엇일까요 const express = require('express') const app = express() const port = 5000 const bodyParser = require('body-parser'); const { User } = require("./models/User"); const config = require('./config/key'); const cookieParser = require('cookie-parser'); const auth = require('./middleware/auth'); // application / x-www-form-urlencoded app.use(bodyParser.urlencoded({extended : true})); // application / json app.use(bodyParser.json()); app.use(cookieParser()); const mongoose = require('mongoose'); //mongoDB 연결 mongoose.connect(config.mongoURI,{ useNewUrlParser: true, useUnifiedTopolongy: true, useCreateIndex: true, useFindAndModify: false }).then(() => console.log('MongoDB connected !')) .catch(err => console.log('MongoDB Error !')); //Hello world 출력 app.get('/', (req, res) => { res.send('Hello World!') }); //register 라우트 app.post('/api/users/register', (req, res) => { // 회원가입 할 때 필요한 정보들을 client으로부터 받아오면 // 그것들을 database에 넣어준다. const user = new User(req.body) user.save((err, userInfo) => { if(err) return res.json({ success : false, err }) return res.status(200).json({ success: true }); }); }); // login 라우트 app.post('/api/users/login', (req, res) => { // console.log('ping') //요청된 이메일을 데이터베이스에서 있는지 찾는다. User.findOne({ email: req.body.email }, (err, user) => { // console.log('user', user) if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다." }) } //요청된 이메일이 데이터 베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인. user.comparePassword(req.body.password, (err, isMatch) => { // console.log('err',err) // console.log('isMatch',isMatch) if (!isMatch) return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." }) //비밀번호 까지 맞다면 토큰을 생성하기. user.generateToken((err, user) => { if (err) return res.status(400).send(err); // 토큰을 저장한다. 어디에 ? 쿠키 , 로컳스토리지 res.cookie("x_auth", user.token) .status(200) .json({ loginSuccess: true, userId: user._id }) }) }) }) }) // auth 라우트 (미들웨어로 사용될 것입니다.) app.get('/api/users/auth', auth, (req, res) => { //여기 까지 미들웨어를 통과해 왔다는 얘기는 Authentication 이 True 라는 말. res.status(200).json({ _id: req.user._id, isAdmin: req.user.role === 0 ? false : true, isAuth: true, email: req.user.email, name: req.user.name, lastname: req.user.lastname, role: req.user.role, image: req.user.image }) }) app.get('/api/users/logout', auth, (req, res) => { // console.log('req.user', req.user) User.findOneAndUpdate({ _id: req.user._id }, { token: "" } , (err, user) => { if (err) return res.json({ success: false, err }); return res.status(200).send({ success: true }) }) }) // 포트를 통해 index.js 를 실행합니다. app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) }); 위는 index.js const { User } = require('../models/User'); let auth = (req, res, next) => { //인증 처리를 하는곳 //클라이언트 쿠키에서 토큰을 가져온다. let token = req.cookies.x_auth; // 토큰을 복호화 한후 유저를 찾는다. User.findByToken(token, (err, user) => { if (err) throw err; if (!user) return res.json({ isAuth: false, error: true }) // console.log('userh', user) req.token = token; req.user = user; next(); }) } module.exports = { auth }; auth.js // 모듈 (User에서는 데이터 베이스를 위한 몽구스, 유저의 비밀번호 암호화를 위한 비크립트, 유저의 개개인 토큰을 얻기 위한 제이슨웹토큰을 가져온다.) const mongoose = require('mongoose'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); // 비밀번호 암호화를 위한 salt 값 설정. salt 값은 암호화된 비밀번호를 해킹하기 어렵게 만들 수 있음. const saltRounds = 10; // 유저의 정보들을 객체화, 이른 바 유저 스키마를 생성한다. ( 몽구스의 메소드 ) // 각 유저들의 이름, 이메일, 비밀번호 등 개인정보를 담기 위한 객체임. const userSchema = mongoose.Schema({ name : { type: String, maxlength: 50 }, email : { type: String, trim: true, unique: 1 }, password : { type: String, minlength: 5 }, lastname : { type: String, maxlength: 50, }, role : { type: Number, default: 0 }, token: { type: String, }, tokenExp: { type: Number }, image : String }) // 유저 스키마 이전에 실행될 것임. userSchema.pre('save', function (next) { var user = this; if (user.isModified('password')) { //비밀번호를 암호화 시킨다. bcrypt.genSalt(saltRounds, function (err, salt) { if (err) return next(err) bcrypt.hash(user.password, salt, function (err, hash) { if (err) return next(err) user.password = hash next() }) }) } else { next() } }) // comparePassword 라는 이름의 유저 스키마 메소드를 생성합니다. ( 당연히 비밀번호 비교를 위한 메소드이겠지요? ) userSchema.methods.comparePassword = function (plainPassword, cb) { //plainPassword 1234567 암호회된 비밀번호 $2b$10$l492vQ0M4s9YUBfwYkkaZOgWHExahjWC bcrypt.compare(plainPassword, this.password, function (err, isMatch) { if (err) return cb(err); cb(null, isMatch); }) } userSchema.methods.generateToken = function (cb) { var user = this; // console.log('user._id', user._id) // jsonwebtoken을 이용해서 token을 생성하기 var token = jwt.sign(user._id.toHexString(), 'secretToken') // user._id + 'secretToken' = token // -> // 'secretToken' -> user._id user.token = token user.save(function (err, user) { if (err) return cb(err) cb(null, user) }) } userSchema.statics.findByToken = function(token, cb) { var user = this; // 토큰을 decode 한다. jwt.verify(token, 'secretToken', function(err, decoded) { // 유저 아이디를 통해서 유저를 찾은 다음에 // 클라이언트에서 가져온 token과 DB에서 가져온 토큰이 일치하는지 확인합니다. user.findOne({ "_id" : decoded, "token" : token }, function(err, user) { if(err) return cb(err); cb(null, user); }) }) } // 유저스키마 => User 라는 이름으로 모델화. const User = mongoose.model('User', userSchema); // 방금 모델화한 User 밖에서도 사용가능하도록 exports. module.exports = { User }; user.js 입니다. 문제가 무엇일까요, ㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
Program에서 플레이어를 불러오지 못합니다.
아래와 같은 오류가 뜨면서 기사와 아처에 에러가 뜨네요. 겟 어택에 대한 부분도 에러가 뜨고 있습니다. 참고로 파트/섹션별로 나누어서 클래스를 만들어서 par1_section5_(이름) 으로 생성했습니다. 무엇이 문제일까요? 혼자 이것저것 수정해봐도 되지 않아 질문남깁니다.
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
github private 접근 어떻게 해야 하나요?
두번째 강의내용에서 github에 접근해 clone 해오는걸 잘 이해가 안가네요 어떻게 접근해서 아이디를 남겨야되는지 github 방문에 다 봐도 그런 링크를 못찾고 했습니다. gist 라는 데도 안보이고요
-
미해결리눅스 시스템 프로그래밍 - 이론과 실습
창 위치 오른쪽으로...
갑자기 궁금해진건데 이번 강의 마지막에 강사님께서 새로운 쉘을 켜시고 창을 오른쪽으로 이동시키셨자나요? 이게 윈도우에서 하던 것처럼 window+방향키로 되긴 했는데 가상머신을 사용하다 보니까 어쩔때는 가상 머신 창 자체가 윈도우상에서 한쪽으로 붙더라고요. 혹시 이 기능을 하는 단축키가 우분투에 따로 있나요? 강사님 화면 밑에 누른 키를 보여주는걸로 봐도 모르겠어서 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
질문
싱글톤 사용되는 오브젝트의 특성이 궁금합니다 강의에서는 게임매니저를 싱글톤 패턴으로 동작 구성 했는데 그외로 몬스터를 설계를 할때 동일한 몬스터를 클론으로 많이 복제 하게 될때 도 싱글톤 으로 패턴을 디자인 해야 하나요?
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
Weather Observation Station 4 문제 해결이 안돼요
SELECT COUNT(city)-COUNT(DISTINCT city) FROM city;쿼리를 위와 같이 적었는데요, 아래 에러가 뜹니다. 왜그럴까요?ERROR 1146 (42S02) at line 1: Table 'city' doesn't exist
-
미해결프론트엔드 개발환경의 이해와 실습 (webpack, babel, eslint..)
compiler.plugin 이 undefined라고 뜹니다.
안녕하세요 TypeError: compiler.plugin is not a function 위와 같은 에러가 떠서 compiler를 찍어봤더니 plugin이 존재하지 않아서 undefined라고 뜹니다. compiler.hooks.emit.tapAsync( 'emit', (compilation, callback) => { const source = compilation.assets['main.js'].source(); console.log(source); callback(); }) } 이 방식을 사용하면 똑같이 나오는데 버전이 바뀐 것인가요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
smtp 설정 파트 오류에 대해 여쭤보고 싶습니다.
안녕하세요 강사님. 우선 개인적으로 강의 정말 재밌게 잘 듣고있습니다. 감사합니다. smtp설정 강의 부분에서 설정을 마치고 새로 회원가입을 할 때 아래와 같은 에러가 생겨서 여쭤보고 싶습니다. javamail.send(mailMessage);에서 mailMessage구문오류 때문이라고 생각해서 다시 강의를 보고 코드를 확인했는데도 그대로네요 혹시 아래와 같은 에러가 어떤 실수를 했을 때 발생할 수 있는지 알려주시면 감사하겠습니다!
-
미해결윤재성의 Vue.js 프로젝트를 통한 실무 개발 과정
Html javascript 순으로 부르는 건가요?
설명해주실 때 html 부른 다음에 div에 자바스크립트를 부른다고 하셔서요. Html 호출 그 다음에 div 이전 Javascript 호출이 맞는 건가요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
module.exports = { auth } 에 대한 질문입니다.
안녕하세요 선생님, auth.js의 마지막 부분에 있는 module.exports = { auth } 에서 {} 를 빼먹었다가 에러가 났는데요, 왜 꼭 {}를 붙여야 작동이 되는 것인지 궁금합니다.