묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
강의 내용 블로그에 정리해서 포스팅해도 괜찮을까요!
안녕하세요 강사님! 시큐리티부터 열심히 수강중입니다! 혹시 강의내용을 정리해서 블로그에 포스팅 해도 괜찮을까요? 항상 좋은 강의 올려주셔서 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원조회 API 버전1 포스트맨에서 could not get response
아래의 코드대로 회원 조회 API를 버전1 과 버전2를 수행하는데, 버전2의 경우는 응답이 잘 받아지는데 버전1은 error: abort 가 뜹니다. /* * 회원 조회 * */ @GetMapping("/api/v1/members") public List<Member> membersV1(){ return memberService.findMembers(); } @GetMapping("/api/v2/members") public Result membersV2(){ List<Member> findMembers = memberService.findMembers(); List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName())) .collect(Collectors.toList()); // 스트림의 처리 결과를 리스트 형태로 수집 return new Result(collect); // Result 클래스를 통해 List<MemberDto>를 반환 }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemoryMemberRepository와 MemberService의 차이는 무엇인가요?
이 둘은 비슷한 메서드를 구현한다고 느껴집니다.(save=join) 왜 이런 구조로 작성하나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence.xml 의 필요성
스프링 DB 2편 강의에서는 jpa를 사용할 때 프로젝트에 따로 persistence.xml을 설정해주지 않았는데 이번 강의에서는 persistence.xml이 없으면 jpa가 제대로 동작하지 않는다고 하셔서 그 이유가 궁금합니다.이전 강의에서는 전부 설정을 gradle로 했는데 이번 강의에서는 maven을 사용해서 그런건가요, 아니면 강의 초반에 스프링이 개입되지 않은 순수 자바로만 jpa 프로젝트를 진행한다고 하신 그 이유 때문인가요? 항상 강의 강의 잘 듣고있습니다. 감사합니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
[MacOS] iterm h2 접속 오류
안녕하세요, 첨부한 사진과 같이 iterm에서 ./h2.sh 명령어를 통해 h2에 접속하려고 할 경우 다음과 같은 문구가 뜨며 h2에 접속이 되지 않습니다.검색해보니 macOS 관련 문제인 것 같긴 한데, 구글 및 커뮤니티에서 h2 접속 관련 질문을 찾아보았을 때 저처럼 h2 접속 오류 문제를 겪고 계신 분은 없으신 것 같아 어떻게 진행해야 할지 질문드립니다.(동일한 버전 - 2.2.224으로 일단 삭제 후, 재설치는 진행해본 상황입니다.)
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
entity 객체에 기본생성자를 넣어주는 이유
안녕하세요User객체에 기본생성자를 넣어야 작동하는 이유가 궁금합니다혹시 필드에 아무값도 넣지않을때를 대비해서 기본생성자를 사용하는건가요?
-
미해결실전! 스프링 데이터 JPA
쿼리 메서드 @Query시 limit
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의 듣는 도중 궁금증이 생겨 질문드립니다.만약 쿼리 메서드를 사용하여 특정 조건에 의해 게시물 10개만 가져오고 싶을 때List<Board> findTop10ByWriteDatetimeGreaterThanOrderByCommentCountDescViewCountDescWriteDatetimeDesc(String writeDatetime);과 같이 지저분하게 코드를 작성할 수 있었는데 메서드 이름이 너무 길어져 @Query를 사용해서 코드 양을 줄이고 싶었습니다. 하지만, jpql에 limit를 사용할 수 없는데 이 경우 어떻게 jpql을 작성해야 하는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 수정이 되지 않는데 이유를 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]상품 수정페이지 에서 상품에 대한 값 변경 시 데이터베이스에 반영이 되지 않는데 이유를 모르겠습니다. 다음은 코드입니다.ItemController.javapackage jpabook.jpashop.Contorller; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.service.ItemService; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller @RequiredArgsConstructor public class ItemController { private final ItemService itemService; @GetMapping("/items/new") public String createForm(Model model) { model.addAttribute("form", new BookForm()); return "items/createItemForm"; } @PostMapping("/items/new") public String create(BookForm form) { Book book = new Book(); //set안쓰고 Book생성자의 파라미터로 넣는게 더 좋은 설계임 book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/"; } @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "items/itemList"; } @GetMapping("items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findById(itemId); // 캐스팅이 별로 좋진 않음 BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "items/updateItemForm"; } @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable("itemId") Long itemId, @ModelAttribute("form") BookForm form) { // Book book = new Book(); 컨트롤러에서 어설프게 엔티티 생성하지 말기 // book.setId(form.getId()); // book.setName(form.getName()); // book.setPrice(form.getPrice()); // book.setStockQuantity(form.getStockQuantity()); // book.setAuthor(form.getAuthor()); // book.setIsbn(form.getIsbn()); // // itemService.saveItem(book); itemService.updateItem(itemId, form.getPrice(), form.getName(), form.getStockQuantity()); return "redirect:/items"; } }ItemService.javapackage jpabook.jpashop.service; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.repository.ItemRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class ItemService { private final ItemRepository itemRepository; @Transactional public void saveItem(Item item) { itemRepository.save(item); } public List<Item> findItems() { return itemRepository.findAll(); } public Item findById(Long itemId) { return itemRepository.findOne(itemId); } public void updateItem(Long itemId, int price, String name, int stockQuantity) { Item findItem = itemRepository.findOne(itemId); findItem.setPrice(price); findItem.setName(name); findItem.setStockQuantity(stockQuantity); } } HTML파일은 모두 복사붙여넣기 하였습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL JOIN강의 수강 중 에러 발생
package jpql; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @Entity public class Team { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); private Member member; public List<Member> getMembers() { return members; } public void setMembers(List<Member> members) { this.members = members; } public Member getMember() { return member; } public void setMember(Member member) { this.member = member; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } JPQL 조인 강의를 따라하고 있는데 이런 에러가 납니다.'Basic' attribute type should not be 'Persistence Entity' package jpql; import javax.persistence.*; @Entity @Table(name = "MEMBER") public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public void changeTeam(Team team){ this.team = team; team.getMembers().add(this); } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Member{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + ", age=" + age + '}'; } }어떻게 해결하면 좋을지 알 수 있을까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
혹시 김영한 선생님 자바 중급/고급 강의 정확히 언제 나오는지 알 수 있을까요
혹시 김영한 선생님 자바 중급/고급 강의 정확히 언제 나오는지 알 수 있을까요~강의 듣는데 이해 안가는 문법들이 많아서요.
-
미해결
버튼 클릭 시 페이지가 로드되지 않는 문제 해결 방법 질문
개요로그인 성공 후 인덱스 페이지로 넘어갑니다.인덱스 페이지에는 "테스트 버튼" 이라는 버튼을 클릭하면, test 로드하는 api 를 호출하도록 했습니다.그러나 api 요청만 진행되고, 페이지는 바뀌지 않습니다.개발자도구 메시지에 해당 페이지의 html 코드만 출력됩니다. 참고자료index.html<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>인덱스 페이지</title> <script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script> </head> <body> <h1>환영합니다!</h1> <p>성공적으로 로그인하셨습니다.</p> <button id="logoutButton">로그아웃</button> <button id="testButton">테스트 버튼</button> <script> $(document).ready(function() { // 로그아웃 버튼 이벤트 $('#logoutButton').click(function() { // 로컬 스토리지에서 토큰 제거 localStorage.removeItem('accessToken'); // 로그인 페이지로 리다이렉션 window.location.href = '/login'; }); // 테스트 버튼 이벤트 $('#testButton').click(function() { // 로컬 스토리지에서 토큰 가져오기 const token = localStorage.getItem('accessToken'); if (token) { $.ajax({ url: '/api/test', // 요청할 서버의 URL type: 'GET', // HTTP 메서드 beforeSend: function(xhr) { // 요청 헤더에 토큰 추가 xhr.setRequestHeader('Authorization', token); }, success: function(data) { // 요청 성공 시 로직 console.log("테스트 요청 성공:", data); alert("테스트 요청 성공"); }, error: function(xhr, status, error) { // 요청 실패 시 로직 console.error("테스트 요청 실패:", xhr.responseText); alert("테스트 요청 실패"); } }); } else { alert("토큰이 없습니다. 다시 로그인해주세요."); } }); }); </script> </body> </html> 보이는 것처럼 로컬 스토리지에서 토큰을 가져온 후 요청 헤더에 다시 담아서 전송합니다.JwtAuthorizationFilter@Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 log.info("헤더에서 토큰 추출"); String tokenValue = jwtUtil.getJwtFromHeader(req); log.info("토큰 : " + tokenValue); if (StringUtils.hasText(tokenValue)) { // 토큰 유효성 검사 if (!jwtUtil.validateToken(tokenValue)) { log.info("Token Error"); return; } Claims info = jwtUtil.getUserInfoFromToken(tokenValue); try { setAuthentication(info.getSubject()); } catch (Exception e) { log.error(e.getMessage()); return; } } else { log.info("토큰이 없습니다."); } filterChain.doFilter(req, res); } // 인증 처리 public void setAuthentication(String loginId) { log.info("인증 성공"); SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = createAuthentication(loginId); context.setAuthentication(authentication); SecurityContextHolder.setContext(context); } // 인증 객체 생성 private Authentication createAuthentication(String loginId) { log.info("인증 객체 생성"); UserDetails userDetails = userDetailsService.loadUserByUsername(loginId); return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); }이렇게 JwtAuthorizationFilter 가 있을 때 헤더에서 토큰이 추출되는 거까지 로그에 다 출력되고, 인증 객체까지 생성되는 걸 확인했습니다. Console2024-02-26T14:31:24.699+09:00 INFO 59767 --- [nio-8081-exec-3] JWT 검증 및 인가 : 토큰 : eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0NiIsImF1dGgiOiJPV05FUiIsImlhdCI6MTcwODkyNDY0NiwiZXhwIjoxNzA4OTI4MjQ2fQ.TLjHCc1_ZtTbzGb-2c0ueLmxgCyxQf1rUQs4DkqMv_c 2024-02-26T14:31:24.706+09:00 INFO 59767 --- [nio-8081-exec-3] JWT 검증 및 인가 : 인증 성공 2024-02-26T14:31:24.706+09:00 INFO 59767 --- [nio-8081-exec-3] JWT 검증 및 인가 : 인증 객체 생성 Hibernate: /* <criteria> */ select u1_0.id, u1_0.email, u1_0.login_id, u1_0.password, u1_0.role from users u1_0 where u1_0.login_id=? 2024-02-26T14:31:24.722+09:00 INFO 59767 --- [nio-8081-exec-3] TestController : test controller로그를 보면 test controller 를 호출하는 거까지 확인할 수 있었습니다.그러나 페이지는 로드되지 않고, 메시지에 html 코드만 출력이 됩니다. 자료 Test.html<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script> <title>Test Page</title> </head> <body> <h1>This is a test page.</h1> </body> </html> 정리로그인 성공 후 인덱스 페이지로 넘어감해당 인덱스 페이지에서 test 페이지로 넘어가고자 함인가 필터 모두 거치고, 토큰 값이 전달되는 거까지 확인했음test controller 까지 요청되지만, 정작 페이지는 불러와지지 않음 대체 제가 뭘 놓친 걸까요 ㅠㅠㅠㅠ 이거때문에 며칠 동안 머리 싸매고 있습니다,,, 제발 도와주세요,,,
-
미해결김영한의 실전 자바 - 기본편
this
빨간색 밑줄친건 안되는 이유가 어떠한 grade 값을 받더라도 99 가 되어버리는 오류 때문에 이 경우는 성립이 안되는건가요 ?
-
미해결JSP 웹 쇼핑몰 프로그래밍 기본 과정(JSP WEB Programming)
toad가 안받아지는데 파일 따로 있나요?ㅜㅜ
toad가 안받아지는데 파일 따로 있나요?ㅜㅜ
-
미해결김영한의 실전 자바 - 기본편
문제2 풀이 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]public class Account { int balance; int deposit(int amount) { return balance += amount; } int withdraw(int amount) { if (balance >= amount) { balance -= amount; } else { System.out.println("잔액 부족"); } return balance; } } 1) Account 클래스의 입금, 출금 메서드를 void가 아닌 int로 선언해서 풀었습니다. 동작은 문제가 원하는대로 하는데 이렇게 풀어도 되나요? 2) void를 써야할 때와 쓰지 않아야 할 때를 구분하기 어렵습니다. 사각형 문제와 다르게 계좌 문제는 Account 클래스 안에 balance가 멤버 변수로 선언되어 있고 그 값을 바꾸는 것이기 때문에 void를 써서 return을 따로 해주지 않아도 되는게 맞나요?
-
미해결김영한의 실전 자바 - 기본편
arraylists
Using ArrayLists도 자바 기본이나 기초편에서 다뤄주시나요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
송아지 찾기 시간초과 질문
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class FindCow { static int personPos; static int cowPos; static int[] idx = {5, 1, -1}; public static int solution(int n) { boolean[] visit = new boolean[10_001]; Queue<Integer> queue = new LinkedList<>(); visit[n] = true; queue.offer(n); int level = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Integer curPos = queue.poll(); for (int k = 0; k < 3; k++) { int nextPos = curPos + idx[k]; if (nextPos == cowPos) { return level + 1; } if (nextPos < 10_001 && nextPos > 0 && !visit[nextPos]) { queue.offer(nextPos); visit[nextPos] = false; } } } level++; } return 1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); personPos = in.nextInt(); cowPos = in.nextInt(); System.out.println(solution(personPos)); } }안녕하세요! 좋은 강의 항상 감사드립니다.강의 중, 송아지 찾기(BFS)에서 시간 초과가 떠서 확인해 보니, 강의에서 올려주신 코드와 딱히 다른 부분이 없어 보이는데 시간초과가 납니다. 왜 그럴까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
여전히 에러가 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @Test void 상품주문_재고수량초과() throws Exception { //give Member member = createMember(); Item item = createBook("베렌과 루시엔", 39000, 10); int orderCount = 11; //when orderService.order(member.getId(), item.getId(), orderCount); //then assertThrows(NotEnoughStockException.class, () -> {orderService.order(member.getId(), item.getId(), orderCount);}, "재고 수량 예외가 발생해야 한다."); }JUNIT5 환경에서 이런식으로 해보았는데, 테스트 통과가 안되고 여전히 jpabook.jpashop2.exception.NotEnoughStockException: need more stock 에러가 발생하네요 ㅠㅠㅠ 구글링도 해보고 커뮤니티글도 다 찾아보았는데,여전히 해결되지 않아 글 남깁니다. 다른 분들이랑 똑같이 코드 작성한거 같은데 뭐가 문제일까요..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUNIT5, assertj활용한 테스트 코드입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.junit4로 해보려고 해도 org.junit.Assert 가 import 불가능하여 따로 테스트 코드를 짜보았습니다. @Test void 상품주문() throws Exception { //give Member member = new Member(); member.setName("jung"); member.setAddress(new Address("서울", "한강로", "12452")); em.persist(member); Book book = new Book(); book.setName("베렌과 루시엔"); book.setPrice(39000); book.setStockQuantity(10); em.persist(book); int orderCount = 3; //when Long orderId = orderService.order(member.getId(), book.getId(), orderCount); //then Order getOrder = orderRepository.findOne(orderId); assertThat(OrderStatus.ORDER).as("상품 주문시 상태는 ORDER.").isEqualTo(getOrder.getStatus()); assertThat(getOrder.getOrderItems().size()).as("주문한 상품 종류 수가 정확해야 한다.").isEqualTo(1); assertThat(getOrder.getTotalPrice()).as("주문 가격은 가격 * 수량이다.").isEqualTo(39000 * orderCount); assertThat(book.getStockQuantity()).as("주문 수량만큼 재고가 줄어야 한다.").isEqualTo(7); }이런식으로 최대한 강사님의 코드와 비슷한 결과가 나오게 해보았는데, 혹시 차이가 있을까요??
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 개수를 증가시키는 코드에서 궁금한 점이 있습니다.
public Long increment() { return redisTemplate .opsForValue() .increment("coupon_count"); } ---------------------------------------------------- public void apply(Long userId) { Long count = couponCountRepository.increment(); if (count > 100) { return; } couponRepository.save(new Coupon(userId)); }코드에서 쿠폰을 100개 발급할 수 있도록 했는데만약 동시에 100만 개의 요청이 들어오게 되면 redis에도 똑같이 100만 번의 요청이 가서 100개의 요청을 제외한 나머지 불필요한 요청을 redis가 처리해야 되는 문제가 발생할 것 같습니다. public void apply(Long userId) { Long count = couponCountRepository.getCount(); if (count > 100) { return; } couponCountRepository.increment(); couponRepository.save(new Coupon(userId)); }그래서 쿠폰 개수를 먼저 가져와서 검증 후 개수를 올리게 되면 또다시 Race Condition이 발생할 것 같습니다.실무에서는 어떠한 방식으로 코드를 작성하시는지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
자바 스프링부트 버전 선택
스프링부트 버전이 2.7x 버전은 없는데 무엇으로 선택해야 하나요?