inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

파일이 수시로 이름이 바껴있네요 ㄷㄷ

미해결

스프링 시큐리티

CustomAuthenticationProvider 로 폼인증방식 강의 진행하셨는데요. Ajax인증방식에서는 FormAuthenticationProvider로 파일명이 Custom에서 바껴있는데 중간에 이름만 바꾸신건가여?? 강의를 듣다보면 파일이름이 달라져서 헷갈립니다. ㄷㄷ 강의진행시에 바로직전까지 했던 소스의 버전관리가 필요해보입니다. 다음강의 들으면 파일명이 혹은 실제코드가 달라져있는게 초짜인 수강생들에겐 좀 힘듭니다.

  • java
  • spring-boot
  • spring-security
Minkoo Lee 댓글 1 좋아요 0 조회수 332

테스트실행중 테스트는 잘 되는데 오류가 한 줄 계속 발생합니다

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 이 오류는 무엇인가요?

  • java
  • spring
  • mvc
  • spring-boot
kimsejin0206 댓글 1 좋아요 0 조회수 410

3-P 자바 기저조건 질문

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

선생님, 강의 잘 듣고 있습니다! 다름이 아니라 혹시 기저조건에 if (price >= answer) { return; } 해당 조건을 추가해주지 않으신 이유가 있을까요? 해당 조건 없이도 시간복잡도 관련해서 영향이 적기 때문일까요..? 감사합니다! 아래는 저의 답안입니다! public class Main { static int n, answer = Integer.MAX_VALUE; static int[][] arr; static boolean[][] visited; static Map<Point, Integer> map = new HashMap<>(); static int[] dy = {-1, 0, 1, 0}; static int[] dx = {0, 1, 0, -1}; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); arr = new int[n][n]; visited = new boolean[n][n]; for (int i = 0; i < n; i++) { String[] s = br.readLine().split(" "); for (int j = 0; j < n; j++) { int price = Integer.parseInt(s[j]); arr[i][j] = price; map.put(new Point(i, j), price); } } go(0, 0); System.out.println(answer); } private static void go(int count, int price) { if (count == 3) { answer = Math.min(price, answer); return; } for (int i = 1; i < n - 1; i++) { for (int j = 1; j < n - 1; j++) { Point point = new Point(i, j); if (check(point)) { go(count + 1, price + flower(point)); wither(point); } } } } private static void wither(Point point) { visited[point.x][point.y] = false; for (int i = 0; i < 4; i++) { int ny = point.x + dy[i]; int nx = point.y + dx[i]; visited[ny][nx] = false; } } private static int flower(Point point) { visited[point.x][point.y] = true; int temp = arr[point.x][point.y]; for (int i = 0; i < 4; i++) { int ny = point.x + dy[i]; int nx = point.y + dx[i]; visited[ny][nx] = true; temp += arr[ny][nx]; } return temp; } private static boolean check(Point point) { for (int i = 0; i < 4; i++) { int ny = point.x + dy[i]; int nx = point.y + dx[i]; if (ny < 0 || nx < 0 || ny >= n || nx >= n || visited[ny][nx]) { return false; } } return true; } } 감사합니다!!

  • 코딩테스트
  • java
  • c++
jwnnoh 댓글 1 좋아요 0 조회수 249

모임참가 취소 할때 로직 질문

미해결

스프링과 JPA 기반 웹 애플리케이션 개발

안녕하세요 이부분에서 event.removeEnrollment(enrollment); 이 메서드를 타고 들어가면 이 메서드가 실행되는데 이때 106라인 ->enrollment.setEvent(null); 이 코드는 꼭 필요 한건가요 ?? 첫번째 사진 보시면 어차피 enrollmentRepository.delete(enrollment); 이걸 실행 하는데 왜 있는건지 이해가 잘 안갑니다 ! =================두번째 질문=========== 이 부분에서 취소를 하면 대기하던사람이 자동 확정 하는 로직인데 대기 하던 사람들 중 제일 먼저 신청을 해놓은 사람들을 정렬해서 true 처리 해야하는데 이건 안되있는거 아닌가요 !!?

  • java
  • spring
  • spring-boot
  • jpa
  • thymeleaf
H K 댓글 3 좋아요 0 조회수 401

데이터 초기화하는 방법(@PostConstruct)

미해결

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

제 문제 해결 접근이 맞는것인지 질문드립니다! 테스트할 때마다 회원, 상품을 새로 등록해야하는 것이 번거로워서, 기본편에서 배운 초기화 콜백을 이용해 우선 Item을 초기화해보려고 했습니다. // ItemService.java @PostConstruct @Transactional public void initData() { Book book1 = new Book(); book1.setName("book1"); book1.setPrice(1000); book1.setStockQuantity(10); book1.setAuthor("Steven"); book1.setIsbn("10000"); itemRepository.save(book1); } 위와 같이 ItemService에 초기화 메서드를 추가했는데 계속 해서 에러가 났습니다. 검색해보니 아무래도 초기화 콜백과 트랜젝션 처리를 initData()하나로 동시에 처리하려다보니 발생한 문제 같았습니다. 초기화 콜백을 확실히 완료하고나서 트랜젝션 처리를 해야 트랜젝션이 정상적으로 작동하는 것 아닌가 싶습니다. 단순히 코드상으로 이를 보장할 방법이 떠오르지 않았습니다. 이 때 떠오른게 DB2편의 @EventListener(ApplicationReadyEvent.class)인데, ApplicationReadyEvent가 스프링 컨테이너 초기화를 완전히 마치고 발생하는 이벤트라고 알고 있습니다. 이렇게 하니 초기화가 잘 됐습니다. 이처럼 선언적 트랜젝션을 적용하는 상황에서 초기화를 하기 위해서는 @EventListener(ApplicationReadyEvent.class)를 적용하는 것이 맞는 접근법일까요? @EventListener(ApplicationReadyEvent.class) @Transactional public void initData() { Book book1 = new Book(); book1.setName("book1"); book1.setPrice(1000); book1.setStockQuantity(10); book1.setAuthor("Steven"); book1.setIsbn("10000"); itemRepository.save(book1); } 정상 작동한 최종 코드입니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
Jaesang Yoon 댓글 2 좋아요 0 조회수 483

HttpSessionSecurityContextRepository를 사용안하는 문제

미해결

스프링 시큐리티

선생님 안녕하세요. 스프링 시큐리티 업데이트 버전만 손꼽아 기다리는 중입니다ㅠㅠ 우선 저는 프로젝트에서 기존 버전이 아니라 최신 버전으로 Security를 적용하고 session 저장소로 @EnableRedisHttpSession를 사용해 Redis를 사용하는 중입니다. Redis에 sessionId가 저장되는것까지 확인했습니다. 선생님 강의보면서 참고하면서 잘 따라왔다고 생각했는데, 아래처럼 에러가 뜹니다. HttpSessionSecurityContextRepository에서 SPRING_SECURITY_CONTEXT Key를 이용해서 찾은게 SecurityContext가 아닌 Authentication 인증객체라는 내용 같은데요. Authentication < SecurityContext < SecurityContextHolder가 아니라 Authentication < SecurityContextHolder가 된것 같습니다. 20240322 21:08:43.930 [http-nio-8080-exec-2] WARN o.s.s.w.c.HttpSessionSecurityContextRepository - SPRING_SECURITY_CONTEXT did not contain a SecurityContext but contained: '{authentication={authorities=[{authority=ROLE_ADMIN}], details={remoteAddress=0:0:0:0:0:0:0:1, sessionId=null}, authenticated=true, principal={password=null, username=sejinpark@email.com, authorities=[{authority=ROLE_ADMIN}], accountNonExpired=true, accountNonLocked=true, credentialsNonExpired=true, enabled=true}, credentials=null, name=sejinpark@email.com}}'; are you improperly modifying the HttpSession directly (you should always use SecurityContextHolder) or using the HttpSession attribute reserved for this class? 그래서 로그인한 상태에서 아래 내용을 출력해도 AnonymousUser가 뜨는데요. SecurityContextHolder.getContext().getAuthentication() 인증 저장소 필터 챕터에서 SecurityContextPersistenceFilter를 deprecated되서 SecurityContextHolderFilter를 디버깅해봤더니, SecurityContextRepository 구현체 2개 (HttpSessionSecurityContextRepository, DelegatingSecurityContextRepository) 중에서 DelegatingSecurityContextRepository로만 가서 문제인것 같습니다. 아예 HttpSessionSecurityContextRepository로 들어가질 않더라구요. 이게 문제인것 같은데, 어느부분을 확인해아할지, 혹은 어떤 필터를 커스텀해야할지 여쭙고싶습니답 참고로 securityContext를 아래처럼 설정했습니다 .securityContext((securityContext) -> securityContext .securityContextRepository(new DelegatingSecurityContextRepository( new HttpSessionSecurityContextRepository() ))

  • java
  • spring-boot
  • spring-security
세진:) 댓글 2 좋아요 0 조회수 591

수업들으며 곰곰히 생각하다가 제가 생각한게 맞는지 질문드립니다.

해결됨

실전! Querydsl

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 동적쿼리 - builder 사용편 강의를 들으며 return query .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, member.team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where(builder) .fetch(); 이 쿼리를 따라 치고 생각해보았습니다. 원래 jpa라면 member객체를 조회해와서 member.getTeam()이나 팀 객체에 액세스 할때 지연로딩이 일어난다고 학습하였습니다. 위 쿼리에서 fetch 조인을 사용하지 않았는데 어떻게 쿼리가 한방에 조회가 됐나 갑자기 의문이 들었습니다. 제가 도출해낸 결과는 반환값이 dto이고 team 객체와 join해서 필요한 값만(team 포함) select 하기때문에 teamId, teamName까지 한방쿼리로 조회가 되는건가요?

  • java
  • jpa
skh990427 댓글 1 좋아요 1 조회수 349

th:object에 대해 질문드립니다.

미해결

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

MVC2편에서 배웠던 것 같지만 헷갈리는 부분이 있어 질문드립니다. // ItemController /** * 상품 수정 */ @PostMapping("/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") BookForm form) { // updateItemForm.html <form th:object="${form}" method="post"> th:object="${form}" 에서 괄호 안에 form을 참조하여 컨트롤러의 @ModelAttritube("form")을 했을 때 요청 파라미터를 바인딩해서 BookForm 객체에 넘겨준다고 이해했는데, @ModelAttritube("form1") 이런식으로 바꿔도 정상적으로 작동했습니다. 혹시 제가 놓친 부분이 있을까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
Jaesang Yoon 댓글 1 좋아요 0 조회수 229

h2 DB TCP 연결이 안됍니다

미해결

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

test 접속하면 연결이되고 db도 생깁니다. 하지만 tcp로 연결이 안됩니다. db파일 삭제 여러번 해봤습니다. 자바 17,. 스프링 부트 3,x , h2 2.2.224 버전입니다. 이유가 뭘까요?

  • java
  • jpa
bachue 댓글 2 좋아요 1 조회수 437

error , exception 이 잘 안됩니다.

미해결

스프링 시큐리티

강사님 소스와 똑같이 했는데도 안되는데요 .... 로그인 실패해도 에러 문구가 안뜹니다. 디버깅하면 Controller 값이 null 로 들어오는데 왜그런걸까요 ?? security 설정에 /login?* 설정도 해줬습니다. @Controller public class LoginController { // 에러가 있을때만 선택적으로 받는다. @RequestMapping(value={"/login"}) public String login(@RequestParam(value = "error", required = false ) String error, @RequestParam(value = "exception", required = false ) String exception, Model model){ model.addAttribute("error",error); model.addAttribute("exception",exception); return "login"; } @GetMapping("/logout") public String logout(HttpServletRequest request, HttpServletResponse response) { Authentication authentiation = SecurityContextHolder. getContext ().getAuthentication(); if (authentiation != null ) { new SecurityContextLogoutHandler().logout(request, response, authentiation); } return "redirect:/login"; } } package com.eazybytes.springsecsection3.security .handler; import java.io.IOException; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.stereotype.Component; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; // 인증 검증시 실패할때 인증 예외 발생 @Component public class CustomAuthenticationFailureHandle extends SimpleUrlAuthenticationFailureHandler { @Override public void onAuthenticationFailure( final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException exception) throws IOException, ServletException { String errorMessage = "Invalid Username or Password"; if (exception instanceof BadCredentialsException) { errorMessage = "Invalid Username or Password"; } else if (exception instanceof InsufficientAuthenticationException) { errorMessage = "Invalid Secret"; } setDefaultFailureUrl("/login?error=true&exception=" + errorMessage); super .onAuthenticationFailure(request, response, exception); } } package com.eazybytes.springsecsection3.security .config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; 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; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import com.eazybytes.springsecsection3.security.provider.CustomAuthenticationProvider; import com.eazybytes.springsecsection3.security.service.CustomUserDetailsService; import jakarta.servlet.DispatcherType; @Configuration public class SecurityConfig { @Autowired private AuthenticationSuccessHandler customerauthenticationSuccessHandler; // 인증 성공후 핸들링 처리 @Autowired private AuthenticationFailureHandler authenticationFailureHandlerl; // 인증 실패후 핸들링 처리 @Autowired private AuthenticationDetailsSource authenticationDetailsSource; // FormWebAuthenticationDetails 을 security 가 사용할 수 있도록 등록 @Autowired private CustomUserDetailsService userDetailsService; // 개발자가 만든 userDetailsService 를 사용 protected void configure (AuthenticationManagerBuilder auth) throws Exception{ // CustomAuthenticationProvider 를 seruciry 가 사용할 수 있도록 등록 auth.authenticationProvider(authenticationProvider()); } @Bean public AuthenticationProvider authenticationProvider() { return new CustomAuthenticationProvider(); } @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable); http.authorizeHttpRequests((auth) -> auth .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() .requestMatchers("/","/users","/users/login/**, /login*").permitAll() /* /login* /login?error=true&exception 접근 허용 */ .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/message").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .anyRequest().authenticated()); http.formLogin((form) -> form.loginPage("/login") .loginProcessingUrl("/login_proc") .defaultSuccessUrl("/") .authenticationDetailsSource(authenticationDetailsSource) .successHandler(customerauthenticationSuccessHandler ) // 인증이 성공한 후 핸들링 처리 .failureHandler(authenticationFailureHandlerl) // 인증이 실패후 후 핸들링 처리 .permitAll() ); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public WebSecurityCustomizer webSecurityCustomizer() { // 정적 리소스 spring security 대상에서 제외 return (web) -> web .ignoring() .requestMatchers( PathRequest.toStaticResources().atCommonLocations() ); } } --------------------- <!DOCTYPE html> <html xmlns:th= "http://www.thymeleaf.org" > <head th:replace= "layout/header::userHead" ></head> <body> <div th:replace= "layout/top::header" ></div> <div class= "container text-center" > <div class= "login-form d-flex justify-content-center" > <div class= "col-sm-5" style="margin-top: 30px ;"> <div class= "panel" > <p>아이디와 비밀번호를 입력해주세요</p> </div> <div th:if= "${param.error}" class= "form-group" > <span th:text= "${exception}" class= "alert alert-danger" >잘못된 아이디나 암호입니다</span> </div> <form th:action= "@{/login_proc}" class= "form-signin" method= "post" > <input type= "hidden" th:value= "secret" name= "secret_key" /> <div class= "form-group" > <input type= "text" class= "form-control" name= "username" placeholder= "아이디" required= "required" autofocus= "autofocus" > </div> <div class= "form-group" > <input type= "password" class= "form-control" name= "password" placeholder= "비밀번호" required= "required" > </div> <button type= "submit" class= "btn btn-lg btn-primary btn-block" >로그인</button> </form> </div> </div> </div> </body> </html>

  • java
  • spring-boot
  • spring-security
Rain D 댓글 2 좋아요 0 조회수 314

thymeleaf tag 질문합니다.

미해결

스프링 시큐리티

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 로그인 하지 않을 때 isAnonymous() 는 동작하는데 로그인 하고 isAuthenticated() 는 동작 하지 않아서 top 메뉴에 로그아웃이 보이지 않네요 로그인 처리가 잘 안돼서 그런건가요 ??

  • java
  • spring-boot
  • spring-security
Rain D 댓글 2 좋아요 0 조회수 224

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

미해결

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

안녕하세요 호돌맨님 강의 항상 잘보고있습니다. 다름이 아니라 실습 중 의도치 않게 동작하는 부분이 있어 질문드립니다. 상황 회원 가입 후 로그인 이 때 유저의 Role 은 ADMIN 메소드 시큐리티로 아래와 같이 자원의 권한 제한 @RestController class HomeController { @GetMapping("/user") @PreAuthorize("hasRole('ROLE_USER')") fun user(): String { return "user 접근 가능👁" } @GetMapping("/admin") @PreAuthorize("hasRole('ROLE_ADMIN')") fun admin(): String { return "admin 접근 가능 👨‍💼" } } 이 때 ExceptionHandler로 Runtime예외를 캐치해 응답을 주고 있습니다. 동시에 커스텀한 403핸들러를 HttpSecurity에 끼워 넣어주었습니다. // ControllerAdvice @ExceptionHandler(Exception::class) fun handleRuntimeException(ex: Exception): ResponseEntity<ErrorResult> { logger.error("ex", ex) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body( ErrorResult( code = "500", message = ex.message, ) ) } // SecurityConfig @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { return http // .. other config.. .exceptionHandling { e -> e.accessDeniedHandler(Http403Handler(objectMapper)) e.authenticationEntryPoint(Http401Handler(objectMapper)) } .build() } 기대하는 동작 ADMIN으로 로그인한 유저가 USER 자원에 접근하면 아래와 같이 응답 { "code": "403", "message": "접근할 수 없습니다.", "validation": null } 실제 동작 { "code": "500", "message": "Access Denied", "validation": null } ControllerAdvice에서 Runtime예외를 처리하지 않는다면 의도대로 403이 응답되는데, ControllerAdvice에서 예외를 포괄적으로 처리하게 되면 403이 응답되지 않습니다. 혹시 이런경우를 겪으신적이 있는지? 따로 해결방법이 있을지 궁금해 여쭙습니다. 감사합니다.

  • vue.js
  • aws
  • spring-boot
  • jpa
  • spring-security
철이와미애 댓글 2 좋아요 0 조회수 1198

14분 50초 일대다 페치조인 질문

미해결

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

public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); System.out.println("zzzzzzzzzzzzzzzzzzzzzzzzzzzz"); //비영속 try{ Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("member1"); member1.setTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("member3"); member3.setTeam(teamB); em.persist(member3); Member member4 = new Member(); member4.setUsername("member4"); member4.setTeam(null); em.persist(member4); em.flush(); em.clear(); String query ="select t From Team t join fetch t.members"; List<Team> result = em.createQuery(query, Team.class).getResultList(); for (Team team : result) { System.out.println("team= " + team.getName() + "|members=" + team.getMembers().size()); } tx.commit(); } catch (Exception e){ tx.rollback(); e.printStackTrace(); }finally { em.close(); } emf.close(); } 이 코드를 실행시켰더니 14분 50초에 나오는 3줄이 나오는 것이 아닌 team= teamA|members=2 team= teamB|members=1 이렇게 나오는데 혹시 어떤 이유에서 그런것인지 궁금합니다.

  • java
  • jpa
서정원 댓글 2 좋아요 3 조회수 663

git 연결할때 오류

미해결

스프링 프레임워크는 내 손에 [스프1탄]

06. 개발환경구축_Git 연결하기 할때에 21초 즈음에 해야하는 finish가 눌리지 않고, Target location for project SpringStart already exists, cannot move project 이러한 오류가 발생합니다

  • jsp
  • spring
  • mvc
  • spring-security
biz 댓글 1 좋아요 0 조회수 288

주문 조회V3 에서 쿼리가 4개 나온다고 하는데, 2개만 나옵니다.

해결됨

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. @GetMapping("/api/v3/orders") public List<OrderDto> orderV3() { List<Order> orders = orderRepository.findAllWithItem(); for (Order order: orders) { System.out.println("order ref = " + order + " id = " + order.getId()); } List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } ... public List<Order> findAllWithItem() { return entityManager.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class) .getResultList(); } 이렇게 한 다음 v3 에게 요청을 넣었습니다. 그 결과 select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.username, o1_0.order_date, oi1_0.order_id, oi1_0.order_item_id, oi1_0.count, i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.artist, i1_0.etc, i1_0.author, i1_0.isbn, i1_0.actor, i1_0.director, oi1_0.order_price, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id join order_item oi1_0 on o1_0.order_id=oi1_0.order_id join item i1_0 on i1_0.item_id=oi1_0.item_id order ref = jpabook.jpashop.domain.Order@801a84d id = 1 order ref = jpabook.jpashop.domain.Order@7be83ead id = 2 다음과 같은 SQL 쿼리를 보냈구요. 그런데 4개가 아니라 2개라서 문의를 드립니다. 그런데 H2 DB에서 해당 쿼리를 입력하면 4개가 잘나옵니다. 또한 포스트맨으로 받은 요청도 2개가 출력됩니다. [ { "orderId": 1, "name": "userA", "orderDate": "2024-03-18T23:29:35.545094", "orderStatus": "ORDER", "address": { "city": "서울", "street": "1", "zipcode": "11111" }, "orderItems": [ { "itemName": "JPA1 Book", "orderPrice": 10000, "count": 1 }, { "itemName": "JPA2 Book", "orderPrice": 20000, "count": 2 } ] }, { "orderId": 2, "name": "userB", "orderDate": "2024-03-18T23:29:35.555094", "orderStatus": "ORDER", "address": { "city": "부산", "street": "2", "zipcode": "22222" }, "orderItems": [ { "itemName": "Spring1 Book", "orderPrice": 20000, "count": 3 }, { "itemName": "Spring2 Book", "orderPrice": 40000, "count": 2 } ] } ] 어떠한 것이 잘못되었는지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
ym Kim 댓글 1 좋아요 5 조회수 1297

AddressEntity delete

해결됨

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

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의 후반부에서 member의 addressHistory에 AddressEntity를 추가하는 것까지 알려주셨는데 member의 addressHistory에서 AddressEntity 값 하나를 삭제하고 싶을때 이런 방식으로 하는게 맞는지 궁금합니다. equals와 hashCode도 잘 고친건지도 궁금합니다. //Address의 equals, hashCode @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address address = (Address) o; return Objects.equals(getCity(), address.getCity()) && Objects.equals(getStreet(), address.getStreet()) && Objects.equals(getZipcode(), address.getZipcode()); } @Override public int hashCode() { return Objects.hash(getCity(), getStreet(), getZipcode()); } //AddressEntity의 equals, hashCode @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AddressEntity that = (AddressEntity) o; return Objects.equals(getId(), that.getId()) || Objects.equals(getAddress(), that.getAddress()); // } @Override public int hashCode() { return Objects.hash(getId(), getAddress().getCity(), getAddress().getStreet(), getAddress().getZipcode()); // } Member findMember = em.find(Member.class, member.getId()); List<AddressEntity> addressHistory = findMember.getAddressHistory(); addressHistory.remove(new AddressEntity("city1", "street", "zipcode"));

  • java
  • jpa
Kang 댓글 1 좋아요 0 조회수 244

HTML코드 및 강의 중간자료들

미해결

스프링과 JPA 기반 웹 애플리케이션 개발

우선 강의중에 보여주셨던 HTML코드들에 대해서 행방을 알수가 없고 키를 강의마다 알려주신다는데 언제 알려주시는지 모르겠습니다. 그래서 완성되어있던 파일에 있는 HTML파일들을 끌어다가 다시 완성시켰는데 코드자체에 CSS,Js가 적용되지 않고 에러가 뜨기도 합니다. Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "!hasNotification" (template: "fragments.html" - line 129, col 24) 혹시 최신화된 코드나 강의 진행도에 따른 코드 접근 방법이 있을까요...? 물론 제가 옛날 강의를 듣는것이다 보니 감수해야 하는 부분이겠지만 하나하나 알아가다보니 강의를 듣는 시간도 늘어지고 지치기 시작하는거 같습니다 시간이 지나면서 바뀌는 부분에 대해서 조금이라도 안내를 해주시거나, 주의할 부분이라던가 아니면 참고할만한 내용들을 추가해주시면 감사하겠습니다.

  • java
  • spring
  • spring-boot
  • jpa
  • thymeleaf
최정식 댓글 3 좋아요 0 조회수 712

스프링 프로젝트 첫 실행부터 계속 오류가 나요 ㅠㅠ 제발 도와주세요

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요 제목 그대로 start.spring.io 에서 강의 내용 따라 그대로 스프링 프로젝트를 생성하고 실행하여 첫 빌드를 하는데 계속 오류가 납니다.. 이틀 동안 너무 스트레스 받다가 도저히 혼자 해결이 안 되어 질문드려요. 제발 도와주십쇼 ㅠㅠ 1번 오류 세부 내용 Download https://services.gradle.org/distributions/gradle-8.6-bin.zip, took 23 s 799 ms Starting Gradle Daemon... Gradle Daemon started in 1 s 867 ms FAILURE: Build failed with an exception. * What went wrong: Multiple build operations failed. Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc-9b249c29-1a91-4470-b675-465ff91418e8) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280-d74ea8fc-73d7-4578-9c43-b8cd0558405c) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27-e5e2c8d8-9b10-4d94-aa86-5ed8eafd0641) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d-888af752-9ab7-43e9-bc4d-c9089f87eee4) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc-9b249c29-1a91-4470-b675-465ff91418e8) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280-d74ea8fc-73d7-4578-9c43-b8cd0558405c) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27-e5e2c8d8-9b10-4d94-aa86-5ed8eafd0641) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d-888af752-9ab7-43e9-bc4d-c9089f87eee4) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d) * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. CONFIGURE FAILED in 14s 2번 오류 세부 내용 C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc-9b249c29-1a91-4470-b675-465ff91418e8 -> C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc 3번 오류 세부 내용 Multiple build operations failed. Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc-9b249c29-1a91-4470-b675-465ff91418e8) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280-d74ea8fc-73d7-4578-9c43-b8cd0558405c) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27-e5e2c8d8-9b10-4d94-aa86-5ed8eafd0641) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27) Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d-888af752-9ab7-43e9-bc4d-c9089f87eee4) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc-9b249c29-1a91-4470-b675-465ff91418e8) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\0a561266a2b57efc5da5664bb0d7e3fc) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280-d74ea8fc-73d7-4578-9c43-b8cd0558405c) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\7b013786ef742a9c8c87e3aaf3d90280) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27-e5e2c8d8-9b10-4d94-aa86-5ed8eafd0641) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\1cb4a041ffa70c8710c09b3490f08d27) > Could not move temporary workspace (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d-888af752-9ab7-43e9-bc4d-c9089f87eee4) to immutable location (C:\Users\tjmg7\.gradle\caches\transforms-4\09e5b33217636222c215e9ce4b40ac0d) * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. 세팅 상태 start.spring.io 에서 자바 17 버전으로 프로젝트 생성했었고요. 그에 맞춰서 인텔리제이 설정도 다 했습니다. 지금 정말 이해가 되지 않는 건 제 데스크톱과 노트북의 환경 세팅을 완전 똑같이 해놨는데 데스크톱에서는 프로젝트 실행이 잘 되는데 노트북에서만 이 에러가 발생한다는 겁니다.. ㅠㅠ 제 데스크톱과 노트북의 환경 차이는 아무리 생각해봐도 데스크톱은 윈도우 10이고 노트북은 윈도우 11이라는 것밖에 생각이 나질 않습니다. .gradle 안에 캐시 폴더 지웠다가 프로젝트 다시 실행도 해봤고요.. .gradle 폴더 자체를 지웠다가 다시 실행도 해봤습니다. 인텔리제이도 여러 번 지웠다가 재설치하고 실행해봤고요. 해결 방법 좀 간곡히 부탁드립니다.. 스프링 공부하고 싶습니다 ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
  • gradle
김민진 댓글 3 좋아요 0 조회수 5178

자바 메모리 구조와 CPU에 대해 질문이 있습니다.

해결됨

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

보통 메모리 구조라고 하면 코드, 데이터, 힙, 스택 영역으로 알고 있습니다. 근데 실행 프로그램이 자바 코드로 이루어져 있다면 메모리 구조는 메서드, 스택, 힙 영역으로 이루어지는건가요? 메서드 영역에 클래스 즉 코드들이 올라간다 했는데 그러면 CPU가 메서드 영역에 있는 자바 코드들을 하나씩 레지스터로 fetch해서 decode, execution 하는건가요? CPU가 클래스 코드들을 해석하면서 메서드 호출일 경우 스택 영역에 스택 프레임을 생성하고 인스턴스 생성일 경우 힙 영역에 인스턴스를 생성하는 건가요? 힙 영역에 인스턴스가 생성된다고 했는데 그러면 필드 코드는 여전히 메서드 영역에 존재하지만 인스턴스가 가지고 있는 필드 값들은 힙 영역에 존재하는 건가요? 감사합니다.

  • java
  • 객체지향
감바스 댓글 1 좋아요 1 조회수 436

분산 DB 에서 비관적 락을 통한 동시성 제어

미해결

재고시스템으로 알아보는 동시성이슈 해결방법

안녕하세요. 분산락을 언제 쓰는게 좋을지 고민하다가 몇 가지 궁금증이 생겨 질문드립니다. 분산 DB 환경이 무엇을 의미하는지? 흔히 분산 DB 환경에서 낙관적, 비관적 락으로 동시성 문제를 해결하기 힘들다고 얘기하더라고요. 여기서 말하는 분산 DB 라는 것이 샤딩에 의해 여러 DB 서버가 있는 것인지, 동일한 데이터를 저장하는 DB 서버가 여러 대 있는 환경을 의미하는 것인지 모르겠습니다. 예를 들어, Ticket 이란 데이터를 저장하는데 동일한 ticket 데이터가 DB server 1, DB server 2 에 저장되어 있는 환경일까요?? 만약 분산 DB 가 샤딩인 경우 비관적 락으로도 동시성 이슈를 해결할 수 있을 것 같은데 맞을까요? 아래 그림처럼 ticketId = 1 인 티켓을 예매하기 위한 요청이 동시에 올 경우 입니다. 처음 x-lock 을 잡은 요청이 끝나야 뒤늦게 온 요청이 해당 티켓의 잔여 수량을 확인하고 예매 하기 때문에 샤딩으로 인한 분산 DB 에서는 비관적 락으로 동시성 이슈를 해결할 수 있을 것 같습니다. 동일한 Ticket 데이터가 여러 DB 서버에 중복되어 저장된 분산 DB 환경에서는 분산락을 사용해야 될 것 같습니다. 그러나, 샤딩은 동일한 Ticket 데이터에 접근하기 위해서는 동일한 서버로 접근하기 때문에 비관적 락으로도 충분히 해결 가능할 것 같아서 질문 드립니다!

  • java
  • spring
  • 동시성
차영호 댓글 2 좋아요 0 조회수 744

인기 태그

인프런 TOP Writers

주간 인기글