묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결윤재성의 만들면서 배우는 Spring MVC 5
Xml 프로젝트에서의 @Lazy 작성 여부
(강의시간 기준으로 00:20:00과 01:01:10입니다.) Xml 프로젝트에서는 Bean을 활용할 때마다 @Lazy를 작성해야 하는걸로 알고있습니다. Xml 프로젝트일 경우 서버가 가동될 때 @Autowired 또는 @Resource가 있다면 최초의 요청없이 무조건 Bean을 주입하려고 시도하고 이때, 오류가 발생하기 때문에 @Lazy를 작성해주는걸로 알고있습니다. Xml 프로젝트의 BoardController.java에서 @Autowired private BoardService boardService; @Resource(name = "loginUserBean") @Lazy private UserBean loginUserBean; boardService에 @Lazy가 없는 이유와 loginUserBean에는 왜 @Lazy가 있는지 차이에 대한 정확한 이유를 잘 모르겠습니다.
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
api 주소는 restful api를 따르면 되는 것 같은데
페이지의 URL 주소는 따로 따라야하거나 추천하는 규칙이 있을까요?
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
페이지 하나마다 컴포넌트를 작성해주시는데요
컴포넌트는 재사용성을 고려한 폼이라고 알고있는데, 각 페이지에서 한번만 필요한 폼도 일일이 컴포넌트를 만들어주나요?
-
미해결포토샵 기본기 하루 5분, 3주 만에 끝내기
블렌딩 스크린랑 오버레이 클릭하면
흰배경으로 되요 ㅠㅠ 그림파일이 이상한 거겠죠?
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
h2 데이터베이스 데이터 저장 관련 질문입니다.
h2를 로컬에 설치해서 spring boot에 연동하여 사용하는 방법 외에 지금 수업과 같은 방식으로 h2 데이터베이스를 사용한다면, postmapping으로 user 데이터를 삽입하고 나서, 그 데이터가 계속 유지되도록 하기 위해서는 서버를 계속 가동해놓는 수 밖에 없는지 궁금합니다!
-
미해결윤재성의 Java 기반 Android 9.0(pie) App 개발 기본 1단계
다이얼 로그 버튼
다이얼 로그의 버튼이 보이질 않습니다
-
해결됨따라하며 배우는 TDD 개발 [2023.11 업데이트]
몽구스 productModel.create() 실행시 undefined를 반환합니다
안녕하세요 강사님. 현재 섹션3 듣고있습니다. 다른 게 아니라 포스트맨으로 아무리 데이터를 보내봐도 createdProduct는 undefined값만 가지고, 실제 db에는 저장이 되지 않습니다. 이거저거 찾아봤지만 원인은 잘 모르겠습니다. 몽고db는 처음 써봐서 그쪽 문제가 아닌가 싶은데 해결법이 있을까요? 아래에 제 코드와 실행결과 첨부하겠습니다. 감사합니다. ---Code--- ---요청--- ---결과---
-
미해결Javascript ES6+ 제대로 알아보기 - 초급
this바인딩 질문
const b = { name : '하하', bb () { return this.name; }, a: x => { return this.name; } } 생뚱맞은 질문 있을수도 있는데 여기서 a: x=> {return this.name}에서 에로우 함수는 함수스코프인데 실행컨텍스트 실행이 this바인딩을 안하니까 const b= {}이쪽 스코프를 참조하니까 객체에서의 this는 window인가여 TT bb() { const b = x => { return this.name; } } 같은경우는 this바인딩 안하니까 외부함수 즉 메소드 bb(){}의 this를 보니까 this는 b를 보는건 알겟는데용
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
Study Event Test 하는 법 문의드립니다.
안녕하세요. 백기선 강사님 강의 참고하여 직접 코드 짜면서 공부하는 도 중 막히는 부분이 생겨 질문 남기게 되었습니다. Study관련한 Event에 대해서 테스트를 해보려고 하는데요. @Transactional @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.MOCK) @AutoConfigureMockMvc public class StudyNotificationTest { @Autowired MockMvc mockMvc; @Autowired ApplicationEventPublisher applicationEventPulbisher; @Autowired NotificationService notificationService; @Autowired NotificationRepository notificationRepository; @Autowired AccountService accountService; @Autowired AccountRepository accountRepository; @Autowired StudyService studyService; @Autowired StudyRepository studyRepository; @Autowired ZoneService zoneService; @Autowired TagService tagService; @Autowired TagRepository tagRepository; @Autowired ThreadPoolTaskExecutor executor; @BeforeEach public void boforeEach() { SignUpForm signUpForm = SignUpForm.builder() .email("test@test.com") .nickname("test") .password("12341234") .build(); Account account = accountService.signUp(signUpForm); account.setStudyCreatedByEmail(true); account.setStudyCreatedByWeb(true); account.setStudyUpdatedByEmail(true); account.setStudyUpdatedByWeb(true); TagForm tagForm = TagForm.builder().title("test").build(); Zone zone = zoneService.findAll().get(0); Tag tag = tagService.save(tagForm); accountService.addTag(account, tag); accountService.addZone(account, zone); StudyForm studyForm = StudyForm.builder() .fullDescription("test") .path("test") .shortDescription("test") .title("test").build(); Study study = studyService.save(studyForm, account); studyService.addTag(study, tag); studyService.addZone(study, zone); } @AfterEach public void afterEach() { accountRepository.deleteAll(); studyRepository.deleteAll(); tagRepository.deleteAll(); notificationRepository.deleteAll(); } @DisplayName("Study Created Event") @Test public void studyCreateEventTest() throws Exception { Study study = studyService.getOnlyStudyByPath("test"); Account account = accountService.findByNickname("test"); applicationEventPulbisher.publishEvent(new StudyCreatedEvent(study)); executor.getThreadPoolExecutor().awaitTermination(1, TimeUnit.SECONDS); List<Notification> notifications = notificationService.findByNotificationType(NotificationType.STUDY_CREATED); assertTrue(notifications.stream().map(Notification::getAccount).collect(Collectors.toList()).contains(account)); } } 위와 같이 코드를 작성했는데, EventListener에서 Study를 조회하는 부분에서 ID에 해당하는 Study가 없다는 오류와 함께 테스트가 진행되지 않았습니다.. (executor 부분은 async 테스트 하는 방법 찾아보던 도중 발견한 코드입니다.) 해당 이벤트를 테스트할 수 있는 방법 문의드립니다. 감사합니다.
-
미해결실전! 스프링 데이터 JPA
안녕하세요 강사님
1편부터 스프링 data 까지 들은 학생입니다. 학습한 것을 응용하기 위해 혼자서 홈페이지를 만드는 도중 궁금한 것이 생겨서 질문 드립니다! validation 관련 질문인데요..! (spring mvc 질문 같지만 ㅜㅜ) spring boot로 private String password1 prvate String password2 이렇게해서 패스워드가 서로 다를 경우 오류가 나게 하는 validation을 작성하려 합니다. @Size나 @notEmpty 같이 기능이 있으면 편할텐데, 구글에 검색해보니 custom validator를 작성하라고 나옵니다 아예 어노테이션을 하나 새로 만드는 일인데.. 혹시 패스워드 오류를 쉽게 표현할 수 있는 방식이 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberService, MemberRepository
두 가지 궁금증이 있어서 질문 드립니다. 1. 왜 Repository는 인터페이스를 만들고 구현체를 만들어 사용하나요? 2. MemberService에서는 왜 구현체인 MemoryMemberRepository가 아니라 MemberRepository를 사용하나요? 3-1. 왜 MemberService에 있는 MemberRepository는 final을 사용하나요? memberRepository가 바뀌지 않게 하기 위한 장치를 하나 더하는 느낌으로 생각해도 괜찮은 건가요? 3-2. MemberController에서 memberService를 정의해서 사용할 때와 MemberService에서 memberRepository를 정의해서 사용할 때 final을 적용하여 사용하는 것이 권장되나요?
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
Map사용 질문
9:16 따로 입력받고 싶어서 했는데 오류가 났어요 무슨이유일까요? 설명하신 map의 원리라면 되야하는 것 아닌가요?ㅠ a=map(int,input("첫번째 숫자 : ")) b=map(int,input("두번째 숫자 : ")) print(a+b)
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
management.endpoints... 을 등록했는데 더 많은 정보가 나타나지 않습니다!!
위와 같이 yml 파일 설정한 뒤, 재실행하였는데 dependency에 추가했을 때와 다른 점이 없는데, 혹시 왜그럴까요..?? 스프링 버전 2.1.17 입니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
쿠키관련) 로그아웃이 되지 않음
안녕하세요. 제로초님~! 강의를 잘 듣고 있습니다. 사소한 문제들은 혼자서 해결해 나가고 있는데, 이 부분은 질문을 검색해도 잘 나오지 않아 질문드립니다. 로그아웃 버튼 클릭시 로그아웃이 되지 않고 401 unauthorize 에러가 발생합니다. 미들웨어에서 res.status(401).send('로그인이 필요합니다')로 해놓은 에러 문구는 뜨지 않고, 콘솔에 401 에러가 뜨는데요. 먼저 isLoggedIn의 미들웨어에 문제가 있다고 생각해서, 브라우저 쿠키를 봤더니 아무것도 존재하지 않았어요 ㅠㅠ 그래서 제 생각에는 쿠키 문제인게 아닌가 하고 있습니다. 잘 안되서 깃헙에서 코드를 퍼와서 복붙해놓긴 했는데, 코드를 첨부합니다. passport) index.js const passport = require('passport'); const local = require('./local'); const { User } = require('../models'); module.exports = () => { passport.serializeUser((user, done) => { // 서버쪽에 [{ id: 1, cookie: 'clhxy' }] done(null, user.id); }); passport.deserializeUser(async (id, done) => { try { const user = await User.findOne({ where: { id } }); done(null, user); // req.user } catch (error) { console.error(error); done(error); } }); local(); }; // 프론트에서 서버로는 cookie만 보내요(clhxy) // 서버가 쿠키파서, 익스프레스 세션으로 쿠키 검사 후 id: 1 발견 // id: 1이 deserializeUser에 들어감 // req.user로 사용자 정보가 들어감 // 요청 보낼때마다 deserializeUser가 실행됨(db 요청 1번씩 실행) // 실무에서는 deserializeUser 결과물 캐싱 passport) local.js const passport = require('passport'); const { Strategy: LocalStrategy } = require('passport-local'); const bcrypt = require('bcrypt'); const { User } = require('../models'); module.exports = () => { passport.use( new LocalStrategy( { usernameField: 'email', passwordField: 'password', }, async (email, password, done) => { try { const user = await User.findOne({ where: { email }, }); if (!user) { return done(null, false, { reason: '존재하지 않는 이메일입니다!' }); } const result = await bcrypt.compare(password, user.password); if (result) { return done(null, user); } return done(null, false, { reason: '비밀번호가 틀렸습니다.' }); } catch (error) { console.error(error); return done(error); } } ) ); }; routes) user.js const express = require('express'); const bcrypt = require('bcrypt'); const { User, Post } = require('../models'); const passport = require('passport'); const router = express.Router(); const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); router.get('/', async (req, res, next) => { // GET /user try { if (req.user) { const fullUserWithoutPassword = await User.findOne({ where: { id: req.user.id }, attributes: { exclude: ['password'], }, include: [ { model: Post, attributes: ['id'], }, { model: User, as: 'Followings', attributes: ['id'], }, { model: User, as: 'Followers', attributes: ['id'], }, ], }); res.status(200).json(fullUserWithoutPassword); } else { res.status(200).json(null); } } catch (error) { console.error(error); next(error); } }); router.post('/login', isNotLoggedIn, (req, res, next) => { passport.authenticate('local', (err, user, info) => { if (err) { console.log(err); return next(err); } if (info) { return res.status(403).send(info.reason); } return req.login(user, async (loginErr) => { if (loginErr) { console.log('loginErr', loginErr); console.log('user', user); return next(loginErr); } const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { exclude: ['password'], }, include: [ { model: Post, attributes: ['id'], }, { model: User, as: 'Followings', attributes: ['id'], }, { model: User, as: 'Followers', attributes: ['id'], }, ], }); console.log(fullUserWithoutPassword); return res.status(200).json(fullUserWithoutPassword); }); })(req, res, next); }); router.post('/', isNotLoggedIn, async (req, res, next) => { console.log(req.body); try { const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { return res.status(403).send('이미 사용중인 아이디입니다.'); } const hashedPassword = await bcrypt.hash(req.body.password, 12); await User.create({ email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); // res.setHeader('Access-Control-Allow-Origin', '*'); res.status(201).send('ok'); } catch (error) { console.error(error); next(error); } }); router.post('/logout', isLoggedIn, (req, res, next) => { req.logout(); req.session.destroy(); res.send('ok'); }); module.exports = router; routes) middlewares.js const express = require('express'); const postRouter = require('./routes/post'); const userRouter = require('./routes/user'); const session = require('express-session'); const cookieParser = require('cookie-parser'); const passport = require('passport'); const db = require('./models'); const cors = require('cors'); const passportConfig = require('./passport'); const app = express(); const dotenv = require('dotenv'); dotenv.config(); db.sequelize .sync() .then(() => { console.log('db 연결!!'); }) .catch(console.error); passportConfig(); app.use(express.json()); app.use( cors({ origin: 'http://localhost:3060', credentials: true, }) ); app.use(express.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get('/', (req, res) => { res.send('hello express'); }); app.use('/post', postRouter); app.use('/user', userRouter); app.listen(3065, () => { console.log('서버 실행 중!!! '); }); app.js const express = require('express'); const postRouter = require('./routes/post'); const userRouter = require('./routes/user'); const session = require('express-session'); const cookieParser = require('cookie-parser'); const passport = require('passport'); const db = require('./models'); const cors = require('cors'); const passportConfig = require('./passport'); const app = express(); const dotenv = require('dotenv'); dotenv.config(); db.sequelize .sync() .then(() => { console.log('db 연결!!'); }) .catch(console.error); passportConfig(); app.use(express.json()); app.use( cors({ origin: 'http://localhost:3060', credentials: true, }) ); app.use(express.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get('/', (req, res) => { res.send('hello express'); }); app.use('/post', postRouter); app.use('/user', userRouter); app.listen(3065, () => { console.log('서버 실행 중!!! '); }); 강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다.
-
해결됨Kevin의 알기 쉬운 RxJava 1부
장표 오타 제보입니다.
안녕하세요 강의 잘 보고 있습니다. ㅎㅎ 퀴즈 3번 에 `List<Integer` 에 `>` 이게 빠졌습니다
-
미해결예제로 배우는 스프링부트 입문
@Valid 와 @NotNull 을 사용할때
전단되는 파라미터 들이 파일 업로드를 하기 위한 enctype="multipart/form-data" 로 전달되면 일반 request 로 받는 값이나 Controller 의 매서드의 매개변수로 있으면서 각 맴버를 받는 커맨드 객체가 @Valid 에 잘 적용되지 않습니다 @Valid 와 @NotNull 을 적용하려면 어떤 방법을 써야 하나요
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
Input UI 스타일링 부분에서 icon 버튼이 뜨지 않습니다.
input UI 쪽에서 button 지우고 span에 awesome font icon 집어넣으면 input box 는 보이는데 icon 들어간 버튼은 보이지않습니다. CDN을 다른걸 가져왔는 확인했는데 뜨운 상태에서 개발자 도구 Elements에는 icon code 가 보입니다. 혹시 버전이 바뀌어선가 생각했는데 그건 혼자 확일을 못했습니다. 아래 TodoInput.vue 에 template와 style을 우선 캡쳐는 해봤습니다. elements와 현재 npm 버전은 6.14.8 이고 node 는 12.19.0 LTS , Vue-Cli 는 4.5.8 입니다.
-
미해결실전! 스프링 데이터 JPA
getOne 관련 에러 질문있습니다.
안녕하세요 수업 너무 재밌게 듣고 있습니다! 혼자 연습중에 난 에러인데 도무지 모르겠어서 질문드립니다. T getOne(ID id); for (){ list.add( ~~~service.getOne) } for문 통해 배열에 엔티티를 넣고 담긴 리스트들을 map 형태로 프론트에 보내면 아래같은 에러가 발생합니다 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["list"]->java.util.ArrayList[0]->zen.zen.entity.Dog$HibernateProxy$4tYFCZYD["hibernateLazyInitializer"]) 반면 OPTIONAL 엔티티 반환하는 findById 를 통해 얻어 리스트로 바꾸고 map으로 보내면 제대로 작동합니다. getOne은 어떤이유에서 에러가 나는지 궁금합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
소스코드 어디가서 볼 수 있을까요... 하 ㅜㅜ
소스 코드는 어디가서 볼 수 있을까요 ㅜ airbnb eslint 설치방법 따라하다가 멋대로 문법 고쳐서져서 엉망되었네요 ㅜ 생각보다 복잡스럽네요....
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
No message available 404
안녕하세요 강사님 말씀하신 postman,intellij에서 실행 해봤는데 둘다 똑같은 오류가 뜨는데 왜 그럴까요..?