inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

반복문 리팩토링 질문드립니다.

해결됨

김영한의 실전 자바 - 기본편

안녕하세요 영한님! 질문은 처음 드리는거 같습니다~ 기본형과 참조형 '문제와 풀이' 시간에 ProductOrder를 리팩토링하는 부분에서 질문이 있습니다. 리팩토링 하는 과정에서 for문 안에서 수행하던 print와 totalAmount를 계산하는 로직을 각각 메서드로 나누었는데요, 이렇게 되면 한번만 수행되던 반복문이 메서드로 나누면서 각각 수행되어 2번이 되는데 이런 부분은 for문이 한번 더 돌게되어 오는 성능이슈보다, 깔끔하게 리팩토링 되는 부분이 더 이점이 큰 부분일까요? 사실 현업에서 업무를 할때도, for안에서 여러가지 로직이 수행되면 한번에 파악하기가 어려워서 나눠야지 싶어서 나누었지만, 한번만 돌던 반복문이 여러번 돌게 될 수 있어서 망설여지는 부분이 있었습니다. 이 부분 질문드립니다! 감사합니다~

  • java
  • 객체지향
  • 리팩토링
suco 댓글 1 좋아요 1 조회수 529

혼자서 푼 문제 확인 부탁드립니다.

미해결

자바 코딩테스트 - it 대기업 유제

import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; class 방향바꾸기 { public int solution(int[][] board) { int answer = 0; /** * n * m 격자판 지도정보 * 격자판에는 각 1,2,3,4 의 값이 존재 * 1: 오른쪽의 인접한 격자로 이동 * 2. 왼쪽의 인접한 격자로 이동 * 3: 아래로 이동 * 4: 위로 이동 * 0,0부터 오른쪽 아래 맨 끝으로 이동하려고함 * board가 주어지면 목표지점까지 가기위해 방향을 바꾸는 최소 격자 개수 * 한 격자의 방향은 원하는 방향으로 한번만 바꾸기 가능 * * * */ //다익스트라로 인접 순회 할때마다 내가 그 격자를 바라보고있는지 확인 //내가 그 격자를 바라보고있으면 1추가 안함 , 바라보지 않으면 1 추가 int[] dx = {-1, 0, 1, 0}; int[] dy = {0, -1, 0, 1}; PriorityQueue<Candidate> queue = new PriorityQueue(); Map<String, Integer> minPosMap = new HashMap<>(); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { minPosMap.put(j + ":" + i, Integer.MAX_VALUE); } } Pos first = new Pos(0, 0); //첫번째 시작을 넣는다. queue.add(new Candidate(first, 0)); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Candidate candidate = queue.poll(); Pos pos = candidate.pos; if (pos.x == board[0].length - 1 && pos.y == board.length - 1) { // print(board, minPosMap); return candidate.cnt; } for (int j = 0; j < 4; j++) { int moveX = dx[j] + pos.x; int moveY = dy[j] + pos.y; if (moveX < 0 || moveY < 0 || moveX >= board[0].length || moveY >= board.length) continue; //현재 Pos 가 moveX, moveY 를 바라보고 있는지 체크 boolean isLookAt = isLookAt(board[pos.y][pos.x], pos, moveX, moveY); //바라보면 cnt 그대로 바라보지 않으면 cnt++ //내가 추가할 값이 기존에 있는 값보다 작아야함 Pos newPos = new Pos(moveX, moveY); int cnt; if (isLookAt) { cnt = candidate.cnt; } else { cnt = candidate.cnt + 1; } Integer baseCnt = minPosMap.get(newPos.getName()); if (cnt < baseCnt) { minPosMap.put(newPos.getName(), cnt); Candidate newCandi = new Candidate(newPos, cnt); queue.add(newCandi); } } } } return answer; } private static void print(int[][] board, Map<String, Integer> minPosMap) { int cnt = 0; for (Integer value : minPosMap.values()) { System.out.print(value + " "); cnt++; if (cnt % board[0].length == 0) System.out.println(); } } private boolean isLookAt(int direction, Pos pos, int moveX, int moveY) { int x = pos.x; int y = pos.y; // * 1: 오른쪽의 인접한 격자로 이동 // * 2. 왼쪽의 인접한 격자로 이동 // * 3: 아래로 이동 // * 4: 위로 이동 int[][] directionCalculate = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; return y + directionCalculate[direction - 1][0] == moveY && x + directionCalculate[direction - 1][1] == moveX; } class Pos { int x; int y; public Pos(int x, int y) { this.x = x; this.y = y; } public String getName() { return x + ":" + y; } } class Candidate implements Comparable<Candidate> { Pos pos; int cnt; public Candidate(Pos pos, int cnt) { this.pos = pos; this.cnt = cnt; } @Override public int compareTo(Candidate o) { return cnt - o.cnt; } } public static void main(String[] args) { 방향바꾸기 T = new 방향바꾸기(); System.out.println(T.solution(new int[][]{{3, 1, 3}, {1, 4, 2}, {4, 2, 3}})); System.out.println(T.solution(new int[][]{{3, 2, 1, 3}, {1, 1, 4, 2}, {3, 4, 2, 1}, {1, 2, 2, 4}})); System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2}, {2, 1, 1, 1, 4, 2}, {2, 2, 2, 1, 2, 2}, {1, 3, 3, 4, 4, 4}, {1, 2, 2, 3, 3, 4}})); System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2, 2, 2}, {2, 1, 1, 1, 4, 2, 1, 1}, {2, 2, 2, 1, 2, 2, 3, 4}, {1, 3, 3, 4, 4, 4, 3, 1}, {1, 2, 2, 3, 3, 4, 3, 4}, {1, 2, 2, 3, 3, 1, 1, 1}})); System.out.println(T.solution(new int[][]{{1, 2, 3, 2, 1, 3, 1, 2, 2, 2}, {1, 2, 2, 1, 1, 1, 4, 2, 1, 1}, {3, 2, 2, 2, 2, 1, 2, 2, 3, 4}, {3, 3, 1, 3, 3, 4, 4, 4, 3, 1}, {1, 1, 1, 2, 2, 3, 3, 4, 3, 4}, {1, 1, 1, 2, 2, 3, 3, 1, 1, 1}})); } } AI로 답변을 달아주시는 것 같은데 이번에도 확인 부탁드립니다. 해설을 보면 강사님이랑 풀이방식은 비슷한것같습니다.

  • java
  • 코딩-테스트
이승환 댓글 1 좋아요 0 조회수 190

회원정보를 조회하는 API서버가 따로 있을때 로직 분리

미해결

스프링 시큐리티

웹앱이 API에 요청을 할때도 올바른 대상이 요청하는게 맞는지 별도의 검증이 필요하지만 우선 그건 무시하고 순수히 웹앱의 유저 인증만 생각했을때의 이야기입니다.. 프론트 역할을 하는 html, css, (바닐라js or jQuery) + spring boot(thymeleaf, spring security) 웹어플리케이션 프로젝트가 있고 회원이 있는지 조회할 수 있는 API 서버(DB와 연결된 spring boot)가 별도로 존재했을때 어떤 프로젝트에 어떤 식으로 시큐리티 및 토큰생성 세팅을 해야할지 감이 잘 오지 않습니다.. 제가 구현하고자 하는건 회원/비회원에 따라 페이지를 동적으로 바꾸거나 (로그인이 로그아웃으로 바뀐다든지) 페이지에 접근을 못하게 하려고 합니다 (마이페이지) 제 생각에는 구현내용 둘 다 API를 굳이 갈 필요가 없기 때문에 웹앱단에서 검증이 이루어져야 할 것 같은데 맞을까요..? API는 회원 유무를 조회한 뒤, 존재하는 경우 단순히 유저정보(or 아예 토큰을 만들어서 넘긴다..?)를 웹앱에 넘겨주는 것까지가 역할이고, 따라서 Spring Security는 여기서 필요하지 않다 웹앱 프로젝트에 스프링 시큐리티 설정을 한 뒤, 스프링부트단에서 API로부터 전달받은 토큰, 혹은 유저정보를 가지고 인증을 처리한다 (하지만 어떻게..?) 이런 흐름이 맞는지 모르겠습니다..

  • java
  • spring-boot
  • spring-security
암차 댓글 2 좋아요 0 조회수 490

회원정보를 조회하는 API서버가 따로 있을때 로직 분리

미해결

스프링부트 시큐리티 & JWT 강의

당연히 웹앱이 API에 요청을 할때도 올바른 대상이 요청하는게 맞는지 별도의 검증이 필요하지만 우선 그건 무시하고 순수히 웹앱의 유저 인증만 생각했을때의 이야기입니다.. 프론트 역할을 하는 html, css, (바닐라js or jQuery) + spring boot(thymeleaf, spring security) 웹어플리케이션 프로젝트가 있고 회원이 있는지 조회할 수 있는 API 서버(DB와 연결된 spring boot)가 별도로 존재했을때 어떤 프로젝트에 어떤 식으로 시큐리티 및 토큰생성 세팅을 해야할지 감이 잘 오지 않습니다.. 제가 구현하고자 하는건 회원/비회원에 따라 페이지를 동적으로 바꾸거나 (로그인이 로그아웃으로 바뀐다든지) 페이지에 접근을 못하게 하려고 합니다 (마이페이지) 제 생각에는 구현내용 둘 다 API를 굳이 갈 필요가 없기 때문에 웹앱단에서 검증이 이루어져야 할 것 같은데 맞을까요..? API는 회원 유무를 조회한 뒤, 존재하는 경우 단순히 유저정보(or 아예 토큰을 만들어서 넘긴다..?)를 웹앱에 넘겨주는 것까지가 역할이고, 따라서 Spring Security는 여기서 필요하지 않다 웹앱 프로젝트에 스프링 시큐리티 설정을 한 뒤, 스프링부트단에서 API로부터 전달받은 토큰, 혹은 유저정보를 가지고 인증을 처리한다 (하지만 어떻게..?) 이런 흐름이 맞는지 모르겠습니다..

  • spring
  • spring-security
  • jwt
암차 댓글 1 좋아요 0 조회수 644

SecurityFilterChain에서 login 이후에 authenticated 인증 처리 오류?

해결됨

스프링부트 시큐리티 & JWT 강의

안녕하세요 수업중 막히는 부분이 있어서 질문 남깁니다. 현재 spring 3, security 6.2버전으로 진행중입니다. 구글링해서 강의 버전에 따른 오류 부분은 고쳤는데요.. ' 문제는 로그인 처리해서 PrincipalDetails에 db에 있는 유저 값을 잘 담기는 했는데.. security config에서 설정한 권한별 경로로 접근하는순간 302로 다시 로그인 홈페이지로 리다이렉트 돼서 수업 진행이 안됩니다.. 뭐가 문제인걸까요? ㅜㅜ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .cors(AbstractHttpConfigurer::disable) .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http .authorizeHttpRequests(au -> au.requestMatchers("/", "/join", "/login").permitAll() .requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ); http.formLogin(f -> f.loginPage("/loginForm") .loginProcessingUrl("/login") .usernameParameter("userName") .passwordParameter("password") .defaultSuccessUrl("/") .permitAll()) .httpBasic(h -> h.disable()); // logout http.logout(logout -> logout. logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/loginForm")); return http.build(); }

  • spring
  • spring-security
  • jwt
codeddd 댓글 1 좋아요 0 조회수 1265

매서드 캡슐화와 테스트 코드

해결됨

김영한의 실전 자바 - 기본편

선생님, 안녕하세요. 내부에서만 사용하는 매서드는 private으로 캡슐화 해두는 것이 좋은 구현이라고 알고 있고, 이번 수업에서도 그런 내용을 확인할 수 있었는데요, private 매서드들도 테스트 코드를 작성해서 테스트 해보고싶은 경우가 자주 발생합니다... 이런 경우 고민을 하다가 몇 가지 방법이 있겠으나 ... 그냥 public 으로 열어버리고 테스트 코드를 두곤 했는데요, 이런 경우에 선생님은 실무에서 어떻게 하셨는지, 가장 좋은 practice가 무엇인지 알고 싶습니다. 항상 감사합니다..^^

  • java
  • 객체지향
Summer Kim 댓글 1 좋아요 3 조회수 562

[hibernate 6] custom 함수 등록 방법 공유

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

Hibernate 6에서는 강의에서 처럼 Dialect를 통한 함수 등록이 불가능합니다. https://start.spring.io/ 로 Spring Boot 3버전으로 만드신 분들은 문제를 겪으실 거라고 생각합니다. 등록법 FunctionContributer 의 구현체를 만들어 준다. package custom; import org.hibernate.boot.model.FunctionContributions; import org.hibernate.boot.model.FunctionContributor; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.type.StandardBasicTypes; public class CustomFunctionContributor implements FunctionContributor { @Override public void contributeFunctions(FunctionContributions functionContributions) { functionContributions.getFunctionRegistry() .register("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING)); } } src/main/resources/META-INF/services/org.hibernate.boot.model.FunctionContributor 파일을 생성한다. 해당 파일에 직접 구현한 CustomFunctionContributor를 등록한다. 패키지명.컨트리뷰터이름 형태로 등록!! custom.CustomFunctionContributor 이렇게 하시면, 강의에서처럼 group_concat함수를 사용하실 수 있습니다. Dialect는 변경 안하셔도 됩니다. reference https://aregall.tech/hibernate-6-custom-functions

  • java
  • jpa
codingNoob12 댓글 5 좋아요 22 조회수 3555

JWTAuthorizationFilter에서,,

미해결

스프링부트 시큐리티 & JWT 강의

강의를 토대로 로그인 페이지를 구현하고, 이를 이용해서 로그인 과정을 거치는 로직을 구현하는 도중에 문제가 발생했습니다. 커스텀 필터를 만들어서 각각 JWTAuthenticationFilter와 JWTAuthorizationFilter를 거치게끔 해놓고, JWTAuthenticationFilter까지는 잘 마무리 지었습니다만, successfulAuthentication 메소드에 response를 설정하고 JWTAuthorizationFilter로 넘길 때 request에 Token을 받아들이지 못합니다.(포스트맨으로 넘길 때는 잘 나오는데 왜그러는지 모르겠네요,,) @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { System.out.println("========================================="); System.out.println("Authentication이 실행됨 : 인증이 완료되었다는 뜻임"); PrincipalDetails principalDetails=(PrincipalDetails)authResult.getPrincipal(); //RSA방식이 아닌, Hash암호방식 String jwtToken = JWT.create() .withSubject(principalDetails.getUsername()) // token 별명 느낌? .withExpiresAt(new Date(System.currentTimeMillis()+JWTProperties.EXPIRATION_TIME)) // Token 만료 시간 -> 현재시간 + 만료시간 .withClaim("id", principalDetails.getMember().getMemberID()) // 비공개 Claim -> 넣고싶은거 아무거나 넣으면 됨 .withClaim("username", principalDetails.getMember().getMemberName()) // 비공개 Claim .sign(Algorithm.HMAC512(JWTProperties.SECRET)); // HMAC512는 SECRET KEY를 필요로 함 //String jwtToken =TokenUtils.generateJwtToken(principalDetails.getMember()); response.addHeader(JWTProperties.HEADER_STRING, JWTProperties.TOKEN_PREFIX+jwtToken); response.setHeader(JWTProperties.HEADER_STRING, JWTProperties.TOKEN_PREFIX+jwtToken); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); System.out.println("response : "+response); System.out.println("JWTAuthenticationFilter에서의 response.getHeader('Authorization')) : "+response.getHeader(JWTProperties.HEADER_STRING)); [ JWTAuthorizationFilter.java ] @Log4j2 public class JWTAuthorizationFilter extends BasicAuthenticationFilter { private final MemberRepository memberRepository; public JWTAuthorizationFilter(AuthenticationManager authenticationManager, MemberRepository memberRepository){ super(authenticationManager); System.out.println("JWTAuthorizationFilter : 인증이나 권한이 필요한 주소가 요청됨"); System.out.println("========================================="); this.memberRepository=memberRepository; } // 인증이나 권한이 필요한 주소 요청이 있을 때 해당 필터를 타게 됨 @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { //String header=request.getHeader("Authorization"); System.out.println("request : "+request); System.out.println("Authorization : "+request.getHeader(JWTProperties.HEADER_STRING)); String header=request.getHeader(JWTProperties.HEADER_STRING); System.out.println("JWTAuthorizationFilter에서의 JWTHeader : "+header); // JWT Token // Enumeration<String> headerNames = request.getHeaderNames(); // while (headerNames.hasMoreElements()) { // String headerName = headerNames.nextElement(); // System.out.println("Header: " + headerName + ", Value: " + request.getHeader(headerName)); // } // header가 있는지(유효한지) 확인 // 토큰이 잘못될 경우 다음 filter로 흘려 보낸다. if(header==null||!header.startsWith(JWTProperties.TOKEN_PREFIX)){ System.out.println("Not Allowed User"); chain.doFilter(request,response); return; } // JWT Token을 검증해서 정상적인 사용자인지 확인 String token = request.getHeader(JWTProperties.HEADER_STRING).replace(JWTProperties.TOKEN_PREFIX, ""); String memberID = JWT.require(Algorithm.HMAC512(JWTProperties.SECRET)).build().verify(token).getClaim("memberID").asString(); // verify()를 통해서 서명 System.out.println("token : "+token); System.out.println("memberID : "+memberID); // 서명이 정상적으로 동작했을 경우 if(memberID!=null){ Member memberEntity = memberRepository.findByMemberID(memberID); System.out.println("UserEntity 정상 : " +memberEntity); PrincipalDetails principalDetails = new PrincipalDetails(memberEntity); System.out.println("MemberName : "+memberEntity.getMemberName()); // JWT Token 서명을 통해서 서명이 정상적이면 Authentication 객체를 만들어준다. Authentication authentication = new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities()); System.out.println("JWTAuthorization에서의 authentication : "+authentication); // 강제로 Security의 Session에 접근하여서 Authentication 객체를 저장시킨다. SecurityContextHolder.getContext().setAuthentication(authentication); System.out.println("Successfully Saved Authentication" + authentication); } // super.doFilterInternal(request, response, chain); chain.doFilter(request,response); } } 더 자세한 내용은 github 참고 부탁드립니다. https://github.com/msun0215/SWProject/tree/1208

  • spring
  • spring-security
  • jwt
msun0215 댓글 2 좋아요 0 조회수 546

강의 개정판 계획 문의

해결됨

스프링 시큐리티

해당 강의 개정판 계획이 있으신지 문의드립니다!

  • java
  • spring-boot
  • spring-security
SHYU 댓글 1 좋아요 2 조회수 475

private static method를 사용하는 이유를 알고 싶습니다.

해결됨

김영한의 실전 자바 - 기본편

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] private static method 를 사용하는 이유를 알고 싶습니다. [질문 배경] 영한님의 다른 강의(스프링 강의로 기억합니다.) 중에 아주 단순한 기능을 private static method를 사용하셔서 만드신 걸 본적이 있었습니다. 왜 private 접근제어자를 사용하셨는데, 인스턴스 메서드가 아닌 static 메서드를 사용하셨을까? 궁금하여 여러 검색과 이리 저리 혼자서 생각도 많이 해보고 나름대로 정리했습니다만 뇌내 망상 수준이라.. 영한님의 답변만큼 확실한건 없을 것 같아 질문드립니다. [검색 등을 통해 제가 정리한 내용] 속도 : 인스턴스 메서드의 경우에는 메서드 영역의 virtual table을 거쳐서 이 인스턴스에 매핑되는 메서드를 조회 후 메서드에 접근해야 하지만, static 메서드의 경우에는 그럴 필요가 없어 인스턴스 메서드에 비해 빠르다. -> 이 부분은 제가 여러 정보를 조합한 내용이라 신빙성이 떨어지고, 과연 속도 측면에서 유의미한 차이가 있을까 의문입니다. 객체지향기반의 커뮤니케이션 : private 접근제어자를 명시하여 캡슐화를 하였으나 static 까지 붙여 이 메서드는 내부에서만 쓸 뿐더러 객체지향적으로 대화할 의도가 없으니 거들떠도 보지 말아라 라는 의미를 담고 있는 것이 아니었을까 추측해봅니다.

  • java
  • 객체지향
  • static
김경민 댓글 1 좋아요 1 조회수 2276

Spring Security Core 6.1.0 버전

해결됨

스프링 시큐리티

Spring Security Core 6.1.0 버전에서는 어떻게 코드를 적용해야 할지 모르겠습니다.

  • java
  • spring-boot
  • spring-security
김지훈 댓글 2 좋아요 1 조회수 620

배열에 대한 질문

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

안녕하세요 강사님 배열에 대해서 정말 이해하기 쉽게 알려주셔서 정말 감사드립니다! students[0] = 90; students[1] = 80; students[2] = 70; students[3] = 60; students[4] = 50; 이 선언문을 for문을 활용해서 students[i]가 이전의 값을 계속 참조해서 10씩 증가 즉, students[0] = 60; students[1] = 70; students[2] = 80; students[3] = 90; students[4] = 100; 이렇게 응용한 코드를 작성해보려고 했는데 해당코드가 리펙토링이 잘 된 코드인지 컨펌을 받고 싶습니다.

  • java
  • 객체지향
옙버디 댓글 2 좋아요 0 조회수 479

11:50초 질문 입니다.

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] @OneToMany 어노테이션 사용시 new ArrayList<>(); 를 관례상 쓰는 이유 외에도 다양한 장점들에 대해 자세히 알 수 있을까요? 감사합니다.

  • java
  • jpa
홋메 댓글 1 좋아요 0 조회수 283

외부 Security Library 의 객체를 찾아내 디버깅 하는 방법이 궁금합니다

해결됨

스프링 시큐리티

이전에도 같은 질문을 드렸었는데, 답을 받지 못해 다시 질문글을 작성합니다!! 수업을 들으면서 강사님과 같은 부분에서 브레이크를 걸고 디버깅을 해보려고 했는데, 해당하는 각 객체들 (FilterChainProxy 등등) 을 어떻게 찾아서 들어가야 하는 지를 모르겠습니다 ㅠㅠ command + shift + f 로 검색해도 나오지가 않는데, 혹시 정확한 repo 위치를 알아서 각 객체를 하나씩 보는 방식(?) 으로 접근해야 하는 걸까요?

  • java
  • spring-boot
  • spring-security
정재빈 댓글 1 좋아요 0 조회수 230

[gradle build error] gradle clear build를 할때 모두 자바 17을 사용하고 있음에도 오류가 발생하고 있습니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요. 다름이 아니고 다음과 같이 gradle은 8.4 버전이고 자바는 17버전을 사용하고 있습니다. 자바 17은 gradle 실행, complie할때 등등 모든 부분해서 11이 아닌 17을 사용하고 있음에도 불구하고 지속적으로 저런 에러가 발생해서 질문드렸습니다. intellij를 껏다 켜보기도 하였구요

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
kim hyunbin 댓글 2 좋아요 1 조회수 1407

userDetailsService의 user정보에 대한 질문입니다.

미해결

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

안녕하세요 호돌맨님! 먼저 좋은강의 너무너무 감사드립니다. 시큐리티 Permission Evaluator 강의에서 알려주실때 컨트롤러로 부터 넘어온 userprincipal 의 id를 이용하여 postService.wirte에서 userRepository에서 user를 조회하셨는데요 질문 리퀘스트가 들어올 때 userDetailsService에서 user를 이미 조회를 하고 해당 유저 정보를 UserPrincipal에 넘겨서 거기서 id만을 이용하여 다시 서비스단에서 user를 조회하고있는데요 userDetailsService단에서 미리 조회해둔 user정보를 userPrincipal에 넘겨서 서비스단(postService.write)에서는 user를 다시 조회하지않고 userPrincipal에서 넘어온 user정보를 사용하면 안되는건가요? 날씨가 많이 추워졌는데 감기조심하시고 남은한해도 좋은일만 가득하세요!

  • aws
  • spring-boot
  • jpa
  • spring-security
falsystack 댓글 1 좋아요 0 조회수 546

main 메서드

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

main 역시 메서드인데, 앞전 메서드에서 받는 변수는 매개변수인데 main 메서드 안에는 인자를 뜻하는 args가 존재하는 건가요?? 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.

  • java
  • 객체지향
호롤로로롱 댓글 1 좋아요 0 조회수 547

12. 다형성과 설계 NewCar에서 pressBrake() 기능을 추가한다면..

해결됨

김영한의 실전 자바 - 기본편

안녕하세요 영한님! 궁금한 점은 OCP 원칙까지 보고나서 생겨난 질문입니다. Car 인터페이스를 구현하는 K3Car, Model3Car, NewCar의 클래스, Driver는 Car인터페이스를 의존하고 있는데요.,,. 강의 내용과 같이 Car 인터페이스에 있는 추상메소드들만 구현한 클래스끼리 있을 때는 크게 어려운 점이 없는 것 같지만.,., 위와 같이 NewCar에서 이 때까지 없었던 pressBrake()라는 기능을 새로 추가하여 Driver에게 해당 메소드를 사용하게 하고싶다면! 어떻게 코드를 짜야하는지 가 저의 궁금증입니다! 먼저 코드를 짜보면서 혼자 해결해보려고 했으나,.., 자바와 아직 완벽히 친해지지 못했는지 더 좋은 방법이 있지 않을까 하며 만족스러운 해법을 찾지 못 하고 있습니다.. 1. Driver 클래스의 drive() 메서드 블록 안에서 instanceof를 사용하여 car변수가 NewCar 클래스일 때 pressBrake()를 사용한다면? 강의에서 배웠던 OCP원칙 중 Closed for modification에 모순이 생겨버리고.. 2. Car 인터페이스에 pressBrake() 메서드를 넣는다면? OCP 원칙에 모순이 생길 뿐더러 오히려 대대적인 코드 수정도 생겨버립니다.. 해당 사항에 대해서는 어떻게 대처를 해야 잘했다고 소문이 날지 궁금하여 질문을 올리게 되었습니다!

  • java
  • 객체지향
박정현 댓글 1 좋아요 4 조회수 554

혹시 마지막 강의 27강 11분쯤 Header에 토큰값 못가져오는경우

미해결

스프링부트 시큐리티 & JWT 강의

안녕하세요. 혹시 PostMan으로 Authorization 체크 해제 후 Post했을때 500error 뜰경우 ( MyFilter3 에 nullpoint오류 ) Spring Security 설정에서 MyFilter3() 필터설정부분 주석해주시면 정상적으로 진행됩니다~!

  • spring
  • spring-security
  • jwt
백근우(qor0923) 댓글 1 좋아요 0 조회수 501

JPA 순환참조 질문 드립니다.

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. EventGroupInformation.java @NotFound(action = NotFoundAction. IGNORE ) @JsonBackReference @ManyToOne(cascade = CascadeType. PERSIST , fetch = FetchType. LAZY ) @JoinColumn(name="CATEGORY_ID", insertable = false, updatable = false) private CategoryInformation categoryInformation; @BatchSize(size = 1000) @JsonManagedReference @OneToMany(mappedBy = "eventGroupInformation", cascade = CascadeType. PERSIST , fetch = FetchType. LAZY ) @Where(clause = "DBSTS = 'O' AND FEED_DISPLAY_YN = 'Y' AND START_DATE <= SYSDATE AND END_DATE >= SYSDATE ") @Column(insertable = false, updatable = false) private List<EventInformation> eventInformations; CategoryInformation.java @BatchSize(size = 1000) @JsonManagedReference @OneToMany(mappedBy = "categoryInformation", fetch = FetchType. LAZY ) @Where(clause = "DBSTS = 'O' AND START_DATE <= SYSDATE AND END_DATE >= SYSDATE ") @Column(insertable = false, updatable = false) //@Access(val ue = AccessType.PRO PERTY) public List<EventGroupInformation> eventGroupInformations; 여러개의 oneToMany가 걸려 있는 entitiy들을 강의 V5예제를 참고하여 개선중에 있습니다. CategoryInformation(Order) ㄴ EventGroupInformation(OrderItem) ㄴ EventInformation(Item) 이런 식에 구조인데요, 각각 oneToMany 입니다. EventGroupInformation과 EventInformation을 fetchJoin을 통해 쿼리를 @Query(value = "SELECT distinct eg FROM EventGroupInformation eg " + "LEFT JOIN FETCH eg.eventInformations e " + "WHERE eg.dbsts = :dbsts " + "AND eg.categoryId IN :categoryIds" ) 호출하면 해당 fetchjoin 쿼리 하나만 나갈꺼라고 생각을했는데, 갑자기 상위 entity인 CategoryInformation 테이블에 category_id(PK)로 category_id 개수만큼의 N+1 이슈가 발생 하였습니다. JsonBackReference, JsonManagedReference 해당 옵션을 주면 역참조가 안되어야 하는게 맞지 않나요?? 추가로 ManyToOne 쪽에 @JsonIgnore 도 추가 해보았으나 마찬가지입니다 ㅠ 제가 놓치고 있는게 있을까요? 김영한 선생님 강의 에서는 OrderItem-Item 관계에서 IN쿼리를 호출했을때 IN절에 포함되는 orderId기준의 상위 엔티티인 Order 테이블에 역으로 쿼리가 나가는건 못봤는데 말이죠.. (물론, 양방향 관계를 끊고 단방향 설정시 N+1 쿼리는 나가지 않습니다.)

  • java
  • spring
  • spring-boot
  • jpa
김정훈 댓글 2 좋아요 1 조회수 609

인기 태그

인프런 TOP Writers

주간 인기글