묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코드로 배우는 React with 스프링부트 API서버
섹션1의 첫번째강의에서 WebStorm으로 프로젝트 진행할때의 질문
WebStorm으로 작업하신다고 하시고 프로젝트 처음에 불러오는 과정이 안나와서 짐작으로 frontend/ch02_start폴더를 만들고 cmd콘솔에서 npm install react-router-dom진행했거든요. 근데 강사님이 실습하는 폴더구조가 다르거든요? 이 과정이 생략되어있어서.. src폴더, public폴더가 자동으로 안생기는데 임의로 src폴더 만들고 그냥 하는건가요? 중간 과정 생략된걸 짐작으로 따라하려다보니 확신이 안들어서 여쭤봅니다
-
미해결스프링부트 시큐리티 & JWT 강의
오류 문의 _ org.springframework.orm.jpa.JpaSystemException: could not deserialize
우선 도움 많이 받고 있습니다 1) 다름이 아니라 3강-시큐리티 회원 가입에서 동영상 강의 12분 10초까지는 제가 작성한 코드가 잘 실행 됩니다. 회원 가입한 데이터가 콘솔에 잘 출력 됩니다 2) 그리고 나서 데이터를 DB까지 잘 저장 하기 위해서 레지파토리를 작성 하여 회원 가입을 시도 했는데 아래와 같이 오류가 발생 합니다 3) 제 소견으로 저는 이미 마리아 DB랑 아래와 같이 설정 하여 사용 중에 있었습니다. 이게 문제인거 같기도 합니다 spring.application.name=FirstProject server.servlet.encoding.force-response=true spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mariadb://localhost:3306/FirstProject?createDatabaseIfNotExist=true spring.datasource.username=root spring.datasource.password=1234 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true spring.jpa.open-in-view=true User(id=0, username=6, password=6, email=6@naver.com, role=null, createDate=null)Hibernate:insertintouser(create_date, email, password, role, username)values(current_timestamp(6), ?, ?, ?, ?)Hibernate:selectu1_0.create_datefromuser u1_0whereu1_0.id=?2024-08-02T21:41:49.880+09:00 ERROR 19076 --- [FirstProject] [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: could not deserialize] with root cause 아래는 코드 내용 입니다 ~~~~~~~ package com.example.FirstProject.config; 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.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록 public class SecurityConfig { // @Bean public BCryptPasswordEncoder encodePwd() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(csrf -> csrf.disable()); http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().permitAll() ); http.formLogin(form -> form .loginPage("/loginForm")); return http.build(); } } package com.example.FirstProject.controller; import com.example.FirstProject.model.User; import com.example.FirstProject.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class indexController { @Autowired private UserRepository userRepository; @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; // 아래는 http://localhost:8080/ 로 들어 왔을 때의 겟 맵핑 임 // http://localhost:8080/ 로 들어오면 index.mustache 페이지로 전환 됨 @GetMapping({"","/"}) public String index(){ return "/index"; } // href="/joinForm"가 들어오거나 URL 주소가 8080/joinForm로 들어오면 페이지는 return 값인 joinForm으로(mustache) 전환 해라 @GetMapping("/joinForm") public String joinForm(){ return "joinForm"; } @GetMapping("/loginForm") public String loginForm(){ return "loginForm"; } // 아래는 href="/user"가 타고 들어 오면 URL 주소는 8080/user 이 되면서 페이지는 return 값인 user로(mustache) 페이지가 전환 됨 @GetMapping("/user") public @ResponseBody String user(){ return "user"; } @GetMapping("/admin") public @ResponseBody String admin(){ return "admin"; } @PostMapping("/join") public @ResponseBody String join(User user){ System.out.println(user); user.setRole("ROLE_USER"); String rawPassword=user.getPassword(); String encPassword=bCryptPasswordEncoder.encode(rawPassword); user.setPassword(encPassword); userRepository.save(user); return "redirect:/loginForm"; } } package com.example.FirstProject.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import java.security.Timestamp; @Entity @Data public class User { @Id // primary key @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String username; private String password; private String email; private String role; //ROLE_USER, ROLE_ADMIN @CreationTimestamp private Timestamp createDate; } package com.example.FirstProject.repository; import com.example.FirstProject.model.User; import org.springframework.data.jpa.repository.JpaRepository; // JpaRepository 를 상속하면 자동 컴포넌트 스캔됨. public interface UserRepository extends JpaRepository<User, Integer> { // Jpa Naming 전략 // SELECT * FROM user WHERE username = 1? // User findByUsername(String username); // SELECT * FROM user WHERE username = 1? AND password = 2? // User findByUsernameAndPassword(String username, String password); // @Query(value = "select * from user", nativeQuery = true) // User find마음대로(); }<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입 페이지</title> </head> <body> <h1>회원가입 페이지</h1> <hr/> <form action="/join" method="post"> <input type="text" name="username" placeholder="Username"/> <br/> <input type="password" name="password" placeholder="Password"/> <br/> <input type="email" name="email" placeholder="Email"/> <br/> <button>회원가입</button> </form> </body> </html> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 페이지</title> </head> <body> <h1>로그인 페이지</h1> <hr/> <!-- 시큐리티는 x-www-form-url-encoded 타입만 인식 --> <form action="/loginProc" method="post"> <input type="text" name="username" placeholder="Username"/> <br/> <input type="password" name="password" placeholder="Password"/> <br/> <input type="email" name="email" placeholder="Email"/> <br/> <button>로그인</button> </form> <a href="/joinForm">회원 가입 페이지 이동</a> </body> </html>
-
미해결코드로 배우는 React with 스프링부트 API서버
writer content
서버 쪽 이랑 이름이 다르면 데이터 바인딩이 안되지 않나요?
-
미해결
JWT 탈취 예방을 위해 어느정도까지 해야하나요?
jwt 탈취 보완을 위해 블랙리스트, RTR 등 다양한 방법이 사용한다는것을 배웠습니다.그런데 점점 jwt의 stateless한 성질을 잃는다고 느껴서 실제 현업에서는 어떻게 사용하고 포트폴리오에서 사용 할 배포용 프로젝트에서도 어느정도까지 보완을하는지 궁금합니다.
-
해결됨코드로 배우는 React with 스프링부트 API서버
querydsl 에러
(사진)
-
미해결코드로 배우는 React with 스프링부트 API서버
안녕하세요 로그인 비밀번호 관리 질문드려용....
안녕하세요 로그인 질문 드립니다. 강의와 크게 상관은 없지만 강의 듣다가 궁금한게 생겨서요..현재 시큐리티 강의 듣고 있습니다. DB에 암호화해서 저장하는건 이해하였습니다. 사용자가 암호를 잊었을때 시큐리티 암호 같은 방식은 암호 재발급 하면 되지만 복원 하는건 힘들어 보이네요 .예를 들어서 이런 방식입니다. 암호의 3째자리 까진 알려주는 방식 암호의 흰트를 입력하면 가입한 이메일에 암호를 보내준다던지...ms sqlserver에는 암호 복원 기능 있는거 같던데 ...암튼 강의듣다가 생각나서 질문 드려요
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
논 블로킹 방식의 동작 원리 이해가 어렵습니다.
강의 교안의 논 블로킹의 정의와 책의 예제(setTimeout 함수를 이용해 작업 시간이 긴 함수를 백그라운드로 보냄)를 읽어 보면오래 걸리는 함수를 백그라운드로 보내는 것 같은데, 그 다음 설명을 보면일부 코드들이 백그라운드에서 병렬로 실행된다고 되어있어서 헷갈립니다. 위 내용을 바탕으로 제가 이해한 것은 작업 시간이 긴 함수, 일부 코드 모두 백그라운드로 전달작업 시간이 긴 함수는 태스크 큐로 전달되고 동시 작업이 가능한 일부 코드들은 백그라운드에서 병렬로 처리일부 코드들의 병렬 처리가 끝나고 나면 태스크 큐에 있는 (블로킹 방식의)작업 시간이 긴 함수 처리 인데 맞을까요?
-
미해결스프링부트 시큐리티 & JWT 강의
[자바] 시큐리티 Config 참고
@Configuration @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록 public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> authorize .requestMatchers("/user/**").authenticated() // /user라는 url로 들어오면 인증이 필요하다. .requestMatchers("/manager/**").hasAnyRole("MANAGER", "ADMIN") // manager으로 들어오는 MANAGER 인증 또는 ADMIN인증이 필요하다는 뜻이다. .requestMatchers("/admin/**").hasRole("ADMIN") // //admin으로 들어오면 ADMIN권한이 있는 사람만 들어올 수 있음 .anyRequest().permitAll() // 그리고 나머지 url은 전부 권한을 허용해준다. ); http.formLogin(form -> form .loginPage("/login")); return http.build(); } }현재 버전 업데이트가 되면서 많이 바꿔어서 참고할 분들은 참고 해주시면 될꺼 같습니다!
-
해결됨코드로 배우는 React with 스프링부트 API서버
router 이동 질문 드립니다.
안녕하세요. 열심히 강의 듣고 있습니다. ... react에서 router 이동에 궁금한거 잇어서 질문 드려요1root 의 라우터에는 TodoIndex와 ProductsIndex 2개의 페이지가 있습니다. ............ 생략 ..............{ path: "todo", element: ...<TodoIndex/>..., children: todoRouter() }, { path: "products", element: ... <ProductsIndex/>..., children: productsRouter() }2.TodoIndex의 child은 todoRoter이고 add의 TodoAdd와 mdify의 TodoModify가 있습니다. { path: "add", element: ...<TodoAdd/>... }, { path: "modify/:tno", element: ...<TodoModify/>... }ProductsIndex의 child은 productsRouter이고 add의 ProductList와 mdify의 ProductModify가 있습니다. 현재 ../products/add 에 있다고 했을때 add 페이지에 있는 버튼을 누르면 ../todo/add 로 점프해서 이동하려면 어떻게 navigate 해야되나요? todo/add에서 todo/modify 이런식의 같은 폴더 레벨이면 쉽게 이동되던데 ...
-
미해결코드로 배우는 React with 스프링부트 API서버
Product 컨트롤러 api 결과값 리턴 질문
상품 등록이나 수정을 하고나서return Map.of("result", "Success")이렇게 리턴해주셨는데실무에서 이런 방식을 많이 사용하나요 아니면 교육목적이기 때문에 조금 러프하게 하신건가요??이번 강의를 보고 실무와 가깝게 프로젝트를 진행하고 싶은데 이렇게 Map에 간단하게 리턴할지 아니면 api마다 매번ResponseEntity에 Http Status Code 담아 리턴해야 할지 기준을 모르겠습니다.제 목적에 맞게 하려면 어떤 방식으로 api 결과를 리턴해줘야 할까요??
-
미해결스프링부트 시큐리티 & JWT 강의
이론강의
안녕하세요OAuth이론강의는 어디에있는지알수잇을까요?
-
미해결코드로 배우는 React with 스프링부트 API서버
파일 업로드 관련 질문
[파일 업로드 설정과 확인] 강의에서 DB에 아주 중요한게 아니라면 성능적인 부분때문에 DB에 파일을 저장하면 안된다고 하셨습니다. 클라우드를 이용하는게 일반적이라고 생각합니다만 한가지 궁금한게 있습니다. 만약 게시글이라는 엔티티에 대표 사진이 딱 한장 들어갈 수 있다고 한다면 아래와 같은 순서로 구현할 수 있겠다는 생각이 들었습니다. 이런 방법에 대해 어떻게 생각하시나요?? 애플리케이션 단에서 이미지 등록 -> 이미지 base64 인코딩 -> 인코딩 된 긴 문자열을 압축 -> 압축된 문자열을 RDB(MYSQL) 게시글 테이블에 게시물 대표이미지 (longtext 형)에 저장.조회할때는 애플리케이션 단에서 별도로 압축된 문자를 원래 인코딩 된 문자열로 디코딩하는 로직 필요하겠지만 비용이 크지 않다고 생각했습니다.
-
미해결지금 당장 NodeJS 백엔드 개발 [사주 만세력]
절입일 데이터 추출관련
절입일 데이터를 혹시 어디서 얻으셨을까요? 한국천문연구원에서는 2004년 이후 데이터만 제공하더라고요. 만세력개발때문에 수업수강했는데 전반적 흐름을 잘 설명되어 있습니다. 도움많이 되고 있습니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
강의 다 듣고 수료증 받을 수 있죠?
강의 다 들으면 수료증 받을 수 있죠?제출해야되서요..
-
해결됨Spring Boot JWT Tutorial
/api/hello 접근 시 401 나올 때 해결법
SecurityConfig.java 를 루트 패키지로 옮기면 됩니다. ex) path.to.root.config.SecurityConfig.java 에서 path.to.root.SecurityConfig.java 로 옮기세요. refs: https://stackoverflow.com/questions/77331852/how-do-i-set-a-home-page-can-be-opened-by-anyone-in-spring-security
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
소셜로그인 User 테이블 관련 질문 있습니다.
소셜로그인을 구현하다가 의문점이 생긴 부분이 있어 어떠한 방식으로 접근하는 것이 궁금하여 질문을 남깁니다.상황일반 회원가입시에는, 이메일 비밀번호 + 해당 서비스에 필요한 필수 정보들을 받고, 해당 내용을 클라이언트로 부터 받아 user테이블에 저장하는 상황입니다.소셜 로그인 같은 경우에는, 정보를 받을 수 있는 것이 제한이 되어있어, 추가적으로 필요한 정보들을, 소셜 로그인 성공 이후, 클라이언트 측에서 회원가입시 필요한 정보들을 받을 수 있는 화면으로 이동시켜, 해당 정보를 받아서, 부족한 정보들을 채워넣는 것으로 알고 있습니다.궁금점.소셜로그인 로그인 후, 신규 유저이기에 서비스 이용에 필요한 필수 부가정보 입력을 받기위해, 회원가입 창으로 이동시켜, 부가 정보를 입력받는다면 크게 문제가 없습니다.하지만, 앱을 사용하다보면은 데이터가 끊긴다거나, 배터리가 방전된다거나, 알수없는 이유로, 로그인은 되었으나, 필수 부가정보를 입력하지 못하고, 꺼지는 경우가 있습니다. 필수 부가정보를 꼭 받아야 하는 경우라면 이 부분에 대해서 어떻게 처리해야하나요?필수 정보를 채웠는지 여부를 확인하는 column을 boolean으로 User 테이블에 추가하여, 클라이언트에서 해당 Column으로 부가정보를 입력받지 않았으면 메인화면으로 가지않고, 회원가입 스크린으로 리다이렉 시키는 이런 로직을 작성해야하나요?필수 정보를 채웠는지 여부를 확인하는 column 없이 이런 경우에 처리할 수 있는 방안이 있는지 궁금하고, 현업에서는 어떤식으로 테이블을 설계하는지 궁금합니다!
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
SequelizeEagerLoadingError: User is not associated to Post!
안녕하세요 제로초님, User 테이블이랑 Post테이블이 관계설정이 안되어있다는 에러가 떠서 문의드립니다. 분명 시퀄라이즈 관계설정하는 부분 빠짐없이 모두 따라했는데 이런 오류가 뜹니다.
-
미해결CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
클라이언트에서 jwt 토큰 핸들링 방식 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 늘 감사히 잘 듣고 있습니다.localStorage에 토큰을 넣는 방식은 좋은 방식인건가요?저는 XSS (Cross-Site Scripting)와 CSRF (Cross-Site Request Forgery) 같은 해킹 방법에 대비하기 위해, Access Token은 전역 변수로 메모리에 저장하고, Refresh Token은 HttpOnly 및 Secure 속성을 가진 쿠키에 저장하는 것이 좋다고 들었습니다. 저도 프론트엔드 프로젝트를 진행할 때 이와 같은 인증 방식을 채택했습니다.하지만 가끔 LocalStorage에 Access Token과 Refresh Token을 보관하는 경우를 보곤 했습니다. 이 방식에는 제가 모르는 다른 이점이 있는 것인지 궁금합니다.현업에서는 클라이언트에서 jwt 토큰을 어떻게 보관하나요?
-
미해결코드로 배우는 React with 스프링부트 API서버
PageResponseDTO 오
TodoServiceImpl에서 PageResponseDTO<TodoDTO> getList 부분에서 오류가 발생합니다. PageResponseDTO혹시 PageResponseDTO 에서 제가 놓친 부분이 있을까요??
-
해결됨코드로 배우는 React with 스프링부트 API서버
함수선언과 화살표 함수
안녕하세요 강사님 강의에서 react는 대부분 함수로 선언하지 않고,화살표 함수를 선언해서 사용해주고 계시는데요, 함수가 아닌 화살표 함수를 사용하는 이유가 따로 있는지 궁금합니다.함수를 사용하지 않는 이유가 있다면 그 이유도 설명해주시면 감사하겠습니다.