묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Model 추가 - v3 질문입니다.
Model 추가 - v3 23분 질문입니다.FrontControllerServletV3 코드입니다.package com.example.servservlet.web.frontcontroller.v3;import com.example.servservlet.web.frontcontroller.MyView;import com.example.servservlet.web.frontcontroller.v3.ControllerV3;import com.example.servservlet.web.frontcontroller.ModelView;import com.example.servservlet.web.frontcontroller.v3.controller.MemberFormControllerV3;import com.example.servservlet.web.frontcontroller.v3.controller.MemberListControllerV3;import com.example.servservlet.web.frontcontroller.v3.controller.MemberSaveControllerV3;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.*;import java.io.IOException;import com.example.servservlet.domain.member.Member;import com.example.servservlet.domain.member.MemberRepository;import com.example.servservlet.web.frontcontroller.v1.ControllerV1;import jakarta.servlet.RequestDispatcher;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.List;import java.io.IOException;import java.util.HashMap;import java.util.Map;@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")public class FrontControllerServletV3 extends HttpServlet { private Map<String, ControllerV3> controllerMap = new HashMap<>(); public FrontControllerServletV3() { controllerMap.put("/front-controller/v3/members/new-form", new MemberFormControllerV3()); controllerMap.put("/front-controller/v3/members/save", new MemberSaveControllerV3()); controllerMap.put("/front-controller/v3/members", new MemberListControllerV3()); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI = request.getRequestURI(); ControllerV3 controller = controllerMap.get(requestURI); if (controller == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } //MemberFormControllerV3,MemberSaveControllerV3 내용을 paramMap에 저장한다. Map<String, String> paramMap = createParamMap(request); ModelView mv = controller.process(paramMap); //질문1. 자식 controller를 부모 ModelView에 저장하는 다형성을 뜻하는건가요?ModelView에 .process함수가 없는데 왜 저장하는거에요? //질문2. 아래부분에서 for문(반복문)이 없고 한개의 뷰네임을 저장하면 나머지 2개의 뷰 처리는 어떻게 하는건가요? //아니면 원래 반복문은 없고 요청이 있는 get(requestURI)만 viewName에 저장하는건가요? // 예를들어 /front-controller/v3/members/save 이면 viewName에 MemberSaveControllerV3()이부분을 저장하는게 맞나요? String viewName = mv.getViewName();//MemberFormControllerV3,MemberSaveControllerV3 내용 중 한개의 뷰네임을 저장한다. MyView view = viewResolver(viewName);//물리적 주소 저장 view.render(mv.getModel(), request, response); } private MyView viewResolver(String viewName) { return new MyView("/WEB-INF/views/" + viewName + ".jsp"); } private Map<String, String> createParamMap(HttpServletRequest request) { Map<String, String> paramMap = new HashMap<>(); request.getParameterNames().asIterator() .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); return paramMap; //<-질문3. 이 부분이 강의에서 각각 파라미터 네임을 계속 꺼내서 저장한다고 하셨는데 반복을 의미하는건가요? }}
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
405에러가 발생합니다. 이유를 잘 모르겠습니다.
1package com.attendance.scheduler.infra.config.security; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @RequiredArgsConstructor @EnableWebSecurity public class SecurityConfig { public static final String[] ENDPOINTS_WHITELIST = { "/", "/submit", "/completion", "/class/**", "/board/**", "/join/**", "/cert/**", "/help/**", "/comment/**", "/css/**", "/js/**" }; private final CustomAuthenticationFailureHandler customAuthenticationFailureHandler; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain adminFilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf(AbstractHttpConfigurer::disable) .securityMatcher("/admin/**","/manage/**") .authorizeHttpRequests(auth -> auth .requestMatchers("/admin/**") .hasAuthority("ADMIN") .requestMatchers("/manage/**") .hasAnyAuthority("ADMIN", "TEACHER") .anyRequest().authenticated()) .formLogin(httpSecurityFormLoginConfigurer -> httpSecurityFormLoginConfigurer .defaultSuccessUrl("/manage/class", true) .failureHandler(customAuthenticationFailureHandler) .loginPage("/login") .loginProcessingUrl("/login") ) .logout(httpSecurityFormLogoutConfigurer -> httpSecurityFormLogoutConfigurer .logoutUrl("/logout") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .logoutSuccessUrl("/")) .sessionManagement(sessionManagement -> sessionManagement .invalidSessionUrl("/login") .maximumSessions(1) .maxSessionsPreventsLogin(true) .expiredUrl("/login")); return httpSecurity.build(); } } 2package com.attendance.scheduler.infra.config.security; import com.attendance.scheduler.admin.domain.AdminEntity; import com.attendance.scheduler.admin.repository.AdminJpaRepository; import com.attendance.scheduler.infra.config.security.Admin.AdminDetails; import com.attendance.scheduler.infra.config.security.User.TeacherDetails; import com.attendance.scheduler.teacher.domain.TeacherEntity; import com.attendance.scheduler.teacher.repository.TeacherJpaRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor public class AccountDetailService implements UserDetailsService { private final AdminJpaRepository adminJpaRepository; private final TeacherJpaRepository teacherJpaRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("teacherId = {}", username); final TeacherEntity teacherEntity = teacherJpaRepository .findByUsernameIs(username); if(teacherEntity != null){ return new TeacherDetails(teacherEntity); } else { final AdminEntity adminEntity = adminJpaRepository .findByUsernameIs(username); if (adminEntity != null) { log.info("adminId = {}", username); return new AdminDetails(adminEntity); } } throw new UsernameNotFoundException(username); } }3<form method='post' th:action="@{/login}" th:object="${login}"> 로그인을 진행하면 405에러가 계속 발생합니다. 이유를 찾고 있으나 아이디와 비밀번호를 입력해도 2번 코드의 로그에 남지 않습니다. 혹시 이유를 알려주실수 있을까요? 감사합니다.
-
미해결지옥에서 온 Git
objects 파일명의 원리 강의에서
강사님 두 가지 질문이 있습니다.강의에서 SHA1의 알고리즘을 이용해 도출된 해시 값은 정확하게 말하면 컴퓨터에서 다루는 파일의 이름인건가요? 아니면 해당 파일 내용을 저장한 메모리의 주소 값인가요?운영체제 공부하면서 파일시스템도 보고 있는데, gistory에서 보여주신 index라는 파일은 디렉터리 테이블인가요? 아니면 index라는 파일? 메모리? 를 만들어서 objects 안의 디렉터리와 파일을 관리하고 있는건가요? 메모리적으로 생각하는데 헷갈려서 질문 드립니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
findAll 테스트 전에는 오류 없었는데 findAll 테스트 했더니 findbyName에서 에러 났어요..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.전체 코드입니다.package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; class MemoryMemberRepositoryTest { MemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); // Assertions.assertEquals(member, result); Assertions.assertThat(member).isEqualTo(result); } @Test public void findByName(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); Member result = repository.findByName("spring1").get(); Assertions.assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result = repository.findAll(); Assertions.assertThat(result.size()).isEqualTo(2); } } 참고로 save 테스트에서 에러가 발생해서 findById 를 String -> Long 으로 바꾼 상태입니다.package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); } package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import java.util.*; public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } }
-
미해결견고한 결제 시스템 구축
혹시.. 실습 코드 제공 받을때 코틀린이 아닌 자바 언어 받을수 있을까요?...
사실 코틀린은 제가 한번도 사용해 본적도 없고 이번에 프로젝트 구성할때 자바로 만들 계획이라서요. 그렇다고 선생님 실습 코드를 전부 그래도 사용하는것은 아닌데요. 강의 보면서 자바로 구성된 코드를 보면서 공부하면 이해하는데 도움이 많이 될것 같아서요... 부탁드립니다!!
-
미해결따라하며 배우는 NestJS
"ID로 특정 게시물 가져오기" 부분이 잘못되었습니다.
@Param('id') 사용 http://localhost/board/id 로 들어가야 하는 것인데, http://localhost/board?id=xxxx 이렇게 설명이 되고 있습니다.아시겠지만.. ?로 처리하는 것은 Query로 해야 하는데, 잘못 설명하신거 같아서 적어봅니다..좋은 강의 감사합니다.다시 개념 잡으려고 보고 있는데, 좋네요.. ㅎㅎ 궁금한게 하나 있는데.. EntityRepostiory를 요새는 사용하지 않는거 같던데..그럼 EntityRepostiory 대신에 뭘 사용하는지 좀 알고 싶습니다. 0.3부터인가 사용하지 않는다고 들어서요..
-
해결됨고객을 이해하는 가장 좋은 방법 : UT와 사용자 인터뷰
인터뷰 관련 질문이 있습니다
인터뷰를 진행하실때 체크리스트를 작성하시고 그것에 관련된 질문들로 인터뷰를 구성하시는 것으로 강의를 이해했는데요,그렇다면 인터뷰를 진행하실때는 관련된 내용을 전부 외운 상태로 노트북이나 다른 자료들은 활용안하시지 것인지 궁금합니다. 항상 유저 인터뷰를 진행할때 물어볼 질문이 많거나 중요한 내용을 빠트리면 안된다는 생각으로 인해 항상 질문자인 저도 노트북을 지참하고 필요한 질문들은 적힌 내용을 참고하며 질문하고 거기에서 꼬리질문이나 추가 질문은 그냥 대화하듯이 진행을 많이 했었기에 여쭤보게 되었습니다.!
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
깃허브에 문제있는것 같습니다.
깃허브에 문제있는것 같습니다.vue-todo 폴더에 들어가지지 않습니다.확인 바랍니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
"HttpServletRequest - 기본 사용법" 강의 내용 중 질문
처음 http://localhost:8080/request-header?username=hello 로 URL 입력 후 콘솔을 확인하면 아래와 같이 Header 편의 조회가 출력되었습니다.이후에 Postman을 통해서 다음과 같이 hello! 라는 메시지를 POST 방식으로 전송을 한 후 콘솔을 확인해 보니 아래와 같이 출력되었습니다.이때 Postman을 통해 보낸 방식에서 cookie가 조회되지 않는 이유는 Postman을 사용해서 POST 요청을 할 때 쿠키 설정을 따로 해주지 않아서 그런거고 크롬에서 URL을 검색해서 GET 방식으로 조회할 때는 크롬이 자동으로 쿠키를 할당해준건거요...??
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
강의 연장 요청 드립니다.
강의 기간이 얼마 남지 않아 강의 연장 부탁 드립니다. 감사합니다.
-
미해결[오토캐드 60강 완성] 프로멘토에게 배우는 2D 도면 작성 / 편집 / 출력과 찐 실무 꿀 팁
오토캐드 갱신
제가 작년에 직업훈련을 받기 위해 교육용 오토캐드를 사용한 적이 있는데 현재 프로그램이 만료가 된 상태입니다. 교육용 서류도 없는데 다시 갱신할 수 있는 방법이 있을까요?
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
pgadmin 서버생성 오류
서버 생성할때 말씀해주신대로usernamepassword에 postgres를 입력하니에러가 뜨네요.... 새로운 user 를 그전에 생성해는 과정이 필요하나요?아님 설치할때 postgres라는 이름의 계정이 생성되던데 그걸 이용할까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
어떤 부분이 문제일까요?
http://boj.kr/f9e04dedecf9402eb6e1bcb1042dcfa6선생님 안녕하세요.선생님이 작성해주신 답이랑 비교해봤을 때, 차이가 나는 부분은 if문을 통해 idx가 a[i].first보다 큰지 작은지를 가른뒤, 계산해주는 부분밖에 없는 것 같습니다. 선생님께서는 a[i].second - a[i].first 또는 idx 이런식으로 직접 해주셨고, 저는 s라는 변수에 a[i].first 또는 idx 를 담아줘서 계산해준 것 밖에 차이가 없다고 생각하는데요.어떤부분이 달라서 정답이 아니라고 나오는 걸까요?? (if(a[i].second <= idx) continue; 이부분은 문제에 웅덩이는 겹치지 않는다는 조건이 있어서 넣지않았습니다.)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
assertThat import, RunWith annotation 관련 문의
=======================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 여기서 import 활성화를 위해서 어떤 조치를 취해야 하는지 궁금합니다. (setting 설정은 Gradle에서 실행하도록 설정해놨음)
-
미해결리눅스 성능 분석 시작하기
좀비프로세스,자식프로세스
안녕하세요 강사님다른분들의 글을 보다 궁금한점이 있어 여쭤봅니다 고아프로세스는 부모 프로세스가 죽은것이고, 좀비 프로세스는 부모프로세스가 죽은것은 아니고자식프로세스를 호출을 못하는것을 좀비 프로세스라고 하는것인가요?그리고 호출을 못한다는 것은 자원회수도 안되고 아무것도 안된다로 이해하였는데 맞을까요? 추가로 SWAP IN이 되어도 SWAP 영역에서 지워지진 않는다 라고 말씀을 주셨고해당 영역을 swap cached라고 하셨는데요, 가끔 보면 top을 보면 메모리 가용영역을 보면 swap부분이 안지워진걸 보고 아 이게 그거구나라고 이해를 하였습니다 그런데 그럼 swap cached는 언제 없어지는 건가요?? 리부팅 시 없어지는 건가요? 혹시 고아프로세는 어떠한 방식으로 현업에서 확인을 하셨는지 궁금합니다
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
17강. TCP 통신 장애 관련 질문드립니다.
강의에서 소개해주신 TCP 장애(Re-transmission, Out of order)에 관해서 질문 드리려고 합니다.Server와 Client구조에서 Server는 Client에게 1~100을 송신한다고 하면 (TCP 통신)통신 장애(Re-transmission, Out of order)가 발생한 경우 Client는 1, 2, 3 ... ,100을 순차적으로 받지 못하고 1, 2, 3, 3, 5, 4 ... 99, 98, 100이런 식으로 값을 받을 수 있다고 강의에서 설명해주셨습니다.그리고 위와 같이 통신 장애가 발생하면 TCP, 즉 L4 layer에서 통신 장애가 발생한 부분을 자동으로 처리(후처리) 해준다고 말씀하셨는데,그렇게 TCP layer에서 후처리 해주면 Client는 값을 정상적으로 받게 되는 건가요?추가로 이런 보정 작업이 100%로 Client가 값을 정상적으로 받는 것을 보장해주는 것인지 궁금합니다지식이 부족해서 명확하게 질문드리지 못한 점 정말 죄송합니다.강의 잘 보고 있습니다. 감사합니다!
-
해결됨[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
강의 크롤링 엑셀 파일로 저장하는 것까지 추가해 봤습니다.
## 엑셀 시트 연습겸 추가했습니다. ## 좋은 강의 감사합니다. import re from bs4 import BeautifulSoup import requests import openpyxl res = requests.get('https://davelee-fun.github.io/blog/crawling_stock_example.html') soup = BeautifulSoup(res.content, 'html.parser') items = soup.select('li.row_sty') excel_file = openpyxl.Workbook() excel_sheet = excel_file.active excel_sheet.title = 'Sheet1' excel_sheet.append(['회사명','주식 가격','변동율']) for i in items: a = i.select_one('div.st_name').get_text().replace(" ","").replace('\n','') b = i.select_one('div.st_price').get_text().replace('\n','').replace(" ","") c = i.select_one('div.st_rate').get_text().replace('\n','').replace(" ","") excel_sheet.append([a,b,c]) excel_file.save('stock.xlsx') excel_file.close()
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DB insert 안됨
window command에서 h2.bat하고 db띄운 후그냥 창x눌러서 껐는데요 그다음 다시 커맨드 열어서 h2.bat하고 insert 쿼리 날렸는데insert가 반영이 안돼요jsessionid 처음 나왔던걸로 해도 안되고새로 나오는 것으로 해도 안되는데창을 새로 띄워도 원래 jsessionid로 해야 하는건가요? test.mv.db 파일도 새로 생성해야 하나요? 파일을 올리고 싶은데 첨부파일 넣는 곳이 없네요 어떻게 해야 하나요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
Bearer라는 단어로 작성하는 이유가 있나요?
항상 좋은 강의 감사합니다.예전에 프론트 개발 할 때도 궁금했던 부분인데Bearer 를 굳이 작성하는 이유나 혹은 작성하게 된 관습의 기원이 궁금합니다.
-
해결됨우아한 고성능 프로그래밍 언어 Rust 입문 및 활용
trait를 인자로 받을 때 &impl과 &dyn차이
Trait강좌에서 &impl만을 사용해 trait를 구현한 객체를 함수인자로 전달 받았는데 &dyn을 사용했을 때 차이가 궁금합니다.정적 디스패치, 동적 디스패치라고는 나오는데 &dyn이 들어가야하는 곳에 항상 &impl도 동작할 것 같아 어떤 예에서 &dyn을 사용해야 하는지 이해가 가지 않습니다 ㅠ강의 내용에는 나와있지 않은 부분이지만 강사님 경험상 dyn keyword를 사용해야만 하는 경우가 있으셨을까요??