묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 오류가 안 뜨고 정상작동합니다
강의 8분 52초경에 findById 쿼리문 옆에 id를 입력하지 않아서 오류가 떠야하는데 저는 통합테스트를 똑같이 돌렸는데도 그냥 진행이 됩니다 왜 저는 오류가 안 뜰까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
26강 오류 질문
26강까지 내용을 모두 따라하고 실행하니 다음과 같은 오류가 뜹니다j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]o.s.boot.SpringApplication : Application run failed yml 설정도 잘 하고 mySql 버전도 맞는데 왜 오류가 날까요? ㅜㅜ
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
mvc회원 저장이 이루어 지지 않고 404 에러페이지로 연결됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MvcMemberSaveServlet입니다.package hello.servlet.web.servletmvc; import hello.servlet.domain.member.Member; import hello.servlet.domain.member.MemberRepository; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save") public class MvcMemberSaveServlet extends HttpServlet { // 싱글톤으로 설정하여 인스턴스를 가져와야함 private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 브라우저에서 넘어온 값 변수로 설정하기 String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); // 파라미터 읽어온 값은 스트링이기 때문에 int형으로 변환을 해주어야 한다. // 자바 코드로 작성한 멤버 객체를 브라우저에서 넘어온 값으로 생성, 저장 Member member = new Member(username, age); memberRepository.save(member); // Model에 데이터를 보관해야 한다. request.setAttribute("member", member); // request객체 내부에 저장소에 저장하는 기능임 String viewPath = "WEB-INF/views/save-result.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); } }save-result.jsp입니다.<li>태그가 인식이 이상하게 되는거 같습니다. 중간에 줄바꿈이 안되요<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 성공 <ul> <li>id= ${member.id}</li><li>username=${member.username}</li> <li>age=${member.age}</li> </ul> <a href="/index.html">메인</a> </body> </html>new-form.jsp입니다.<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="save" method="post"> username: <input type="text" name="username" /> age: <input type="text" name="age" /> <button type="submit">전송</button> </form> </body> </html>어느 부분에서 틀린건지 찾아봐도 모르겠습니다 .ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
id가 +1씩 증가 안하고 갑자기 34 35 로 뛰는 현상
이전 강의 따라 진행할때도 id가 1, 2, 34 이렇게 숫자가 갑자기 증가해서 실수한 줄 알고 테이블 드랍 후 진행했었는데 다음 강의 따라 진행하는 과정에서도 이 문제가 발생합니다! 이번 강의에서는 delete from member 로 테이블 데이터를 날리기 전부터 이 문제가 발생했고 무시하고 진행한 후 테스트하는 과정에서도 이렇게 숫자가 급격하게 증가해버리네요...어떤 부분에서 문제가 생긴걸까요...?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Jsp파일 생성시 자동완성 안되는거 어떻게 하나요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영한님은 jsp파일을 생성하시면 기본 html 태그들이 자동 완성 되어 나오시는데 저는 그저 빈 파일만 생성이 됩니다. 무료와 유료의 차이인것인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
커뮤니티 글들을 보다가 의문점이 드는게 있어서 질문드립니다
[질문 내용]스프링을 활용한 실무코드를 다루는 부분에 관한 질문이였는데 답변이 실무에서 사용하는 방식은 스프링 MVC - 실용적인 방식편에서 다룬다는 답변이였는데 커리큘럼을 뒤져봐도 그런목차나 제목을 가진게 없어서 여쭤보고싶습니다 혹시 어디일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성 메서드 질문드립니다.
오늘 고민있어요부터 질문이 벌써 세 번째네요 ^^; 항상 친절히 답변주셔서 감사합니다. 강의에서 말씀하신 '생성 메서드'가 JPA 기본편의 '연관관계 편의 메서드' 같다는 생각이 듭니다. 물론 연관관계 편의 메서드처럼 하나의 메서드로 양방향 setter 역할을 해주는 건 아니지만, 좀 유사점이 있다고 보이는데 맞을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HttpSession 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HttpSession 1. getSession / setAttribute다른 질문들의 답변을 보니 세션 저장소가 Map<JSESSIONID, Map<String, Object>>형태로 저장되어 있다고 하셨는데getSession이 request에 담겨 있는 cookie(JSESSIONID)값으로 세션 저장소에서 Map<String, Object>을 반환하고 이 것을 세션이라고 하는건가요?그리고 getSession(true)일 때 세션이 없으면 세션을 생성하는데, 세션을 생성할 때 JSESSIONID를 만들어서 response에 cookie로 보내고, 세션 저장소에 만들어진 JSESSIONID를 key, 빈 Map을 value로 저장하고, 비어 있는 Map<String, Object>을 반환하나요?그리고 setAttribute로 Map<String, Object>에 값을 저장하는건가요? 2. getAttributegetAttribute할 때는 request에 있는 JSESSIONID로 세션 저장소에서 Map<String, Object>을 찾고, LOGIN_MEMBER값으로 실제 Object(Member)를 찾는 걸까요? 3.마지막으로 세션 저장소가 Map<JSESSIONID, Map<String, Object>> 형식인데 JSESSIONID가 각 member별로 생성되니까, value가 Map<String, Object> 형식이지만 이 맵에는 실제로는 한 쌍의 key, value만 저장되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order 테이블의 '전체 주문 가격 조회' 메서드의 위치
전체 주문 가격을 조회하는 메서드(getTotalPrice)가 Order 클래스에 위치하고 있습니다. 그런데 주문 상품과 그 수량에 대한 정보는 OrderItem에 있습니다. 따라서 해당 엔티티에 전체 주문 가격을 조회하는 로직이 있어야 자연스러울 것 같은데 강의에서는 Order에 위치하고 있습니다. 전체 주문 가격을 조회하는 메서드가 둘 중 어디에 있어도 상관 없는건가요, 아니면 강의에서처럼 Order 클래스에 있어야만 하는데 제가 놓친 것이 있을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션4 Model 추가 v3 파트 질문있습니다.
import hello.servlet.domain.member.Member; import hello.servlet.domain.member.MemberRepository; import hello.servlet.web.frontcontroller.ModelView; import hello.servlet.web.frontcontroller.v3.ControllerV3; import java.util.Map; public class MemberSaveControllerV3 implements ControllerV3 { private MemberRepository memberRepository = MemberRepository.getInstance(); @Override public ModelView process(Map<String, String> paraMap) { String username = paraMap.get("username"); int age = Integer.parseInt(paraMap.get("age")); Member member = new Member(username, age); memberRepository.save(member); ModelView mv = new ModelView("save-result"); mv.getModel().put("member", member); return mv; } } 안녕하세요 . mv.getModel().put("member", member);'put(java.lang.String, java.util.Objects)' in 'java.util.Map' cannot be applied to '(java.lang.String, hello.servlet.domain.member.Member)'요청 타입은 오브젝트이지만 제공된 것은 Member가 제공되어 다음 단계로 진행을 못하고 있습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이해가 잘 되지 않습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@GetMapping public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model){ if(memberId == null){ // 로그인 안한 사람 return "home"; } Member loginMember = memberRepository.findById(memberId); if(loginMember == null){ // 쿠키가 있어도 db에 없는 경우 return "home"; } model.addAttribute("member", loginMember); return "loginHome"; } 홈 컨트롤러에서 로그인을 아예 한 적이 없으면 쿠키가 없어서 return "home"인 게 이해가 되는데 두 번째에 쿠키가 있어도 회원이 db에 없는 경우가 무슨 상황인지 잘 이해가 되지 않습니다.쿠키가 있으려면 회원 로그인을 해야 하는데 회원이 db에 없을 수 있는지 궁금합니다
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산 DB 에서 비관적 락을 통한 동시성 제어
안녕하세요. 분산락을 언제 쓰는게 좋을지 고민하다가 몇 가지 궁금증이 생겨 질문드립니다.분산 DB 환경이 무엇을 의미하는지?흔히 분산 DB 환경에서 낙관적, 비관적 락으로 동시성 문제를 해결하기 힘들다고 얘기하더라고요. 여기서 말하는 분산 DB 라는 것이 샤딩에 의해 여러 DB 서버가 있는 것인지, 동일한 데이터를 저장하는 DB 서버가 여러 대 있는 환경을 의미하는 것인지 모르겠습니다.예를 들어, Ticket 이란 데이터를 저장하는데 동일한 ticket 데이터가 DB server 1, DB server 2 에 저장되어 있는 환경일까요??만약 분산 DB 가 샤딩인 경우 비관적 락으로도 동시성 이슈를 해결할 수 있을 것 같은데 맞을까요?아래 그림처럼 ticketId = 1 인 티켓을 예매하기 위한 요청이 동시에 올 경우 입니다. 처음 x-lock 을 잡은 요청이 끝나야 뒤늦게 온 요청이 해당 티켓의 잔여 수량을 확인하고 예매 하기 때문에 샤딩으로 인한 분산 DB 에서는 비관적 락으로 동시성 이슈를 해결할 수 있을 것 같습니다.동일한 Ticket 데이터가 여러 DB 서버에 중복되어 저장된 분산 DB 환경에서는 분산락을 사용해야 될 것 같습니다.그러나, 샤딩은 동일한 Ticket 데이터에 접근하기 위해서는 동일한 서버로 접근하기 때문에 비관적 락으로도 충분히 해결 가능할 것 같아서 질문 드립니다!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
springSecurity
이미 질문남기신 분들이 많기에 해당 코드들을 따라서 실행하려고 해 보았으나 스프링 시큐리티 버젼이 올라감에 따라 새롭게 코드를 작성을 해보기 위해 문서를 참고해서 수정을 했습니다만 접속을 하려고 보니 HTTP ERROR 403 에러가 뜨면서 localhost접근이 막히더군요 혹시 고쳐야할 부분이 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원웹기능-홈/ Process finished with exit code 1
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]home.html까지 만들고 run을 했는데Action:Consider defining a bean of type 'hello.hellospring.domain.Member' in your configuration.Process finished with exit code 1 이런 오류가 뜹니다.domain.Member는 package hello.hellospring.domain; public class Member { private Long id; private String name; 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; } }입니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
NullPointerException
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. java.lang.NullPointerException: Cannot invoke "hello.jdbc.repository.MemberRepositoryV1.save(hello.jdbc.domain.Member)" because "this.memberRepository" is nullmemberRepositoryV1.save 하는 과정에서 널포인터익셉션이 났습니다. package hello.jdbc.repository; import hello.jdbc.connection.DBConnectionUtil; import hello.jdbc.domain.Member; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.support.JdbcUtils; import javax.sql.DataSource; import java.sql.*; import java.util.NoSuchElementException; /** * JDBA - DataSource 사용, JdbcUtils 사용 */ @Slf4j public class MemberRepositoryV1 { private final DataSource dataSource; public MemberRepositoryV1(DataSource dataSource) { this.dataSource = dataSource; } public Member save(Member member) throws SQLException { String sql = "insert into member(member_id, money) values (?,?)"; Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney()); pstmt.executeUpdate(); return member; }catch (SQLException e) { log.info("db error", e); throw e; }finally { close(con, pstmt, null); } } public Member findById(String memberId) throws SQLException { String sql = "select * from member where member_id=?"; Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, memberId); rs = pstmt.executeQuery(); if (rs.next()) { Member member = new Member(); member.setMemberId(rs.getString("member_id")); member.setMoney(rs.getInt("money")); return member; } else { throw new NoSuchElementException("member not found memberId=" + memberId); } } catch (SQLException e) { log.info("db error", e); throw e; }finally { close(con, pstmt, rs); } } public void update(String memberId, int money) throws SQLException { String sql = "update member set money=? where member_id=?"; Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setInt(1, money); pstmt.setString(2, memberId); int resultSize = pstmt.executeUpdate(); log.info("resultSize={}", resultSize); }catch (SQLException e) { log.info("db error", e); throw e; }finally { close(con, pstmt, null); } } public void delete(String memberId) throws SQLException { String sql = "delete from member where member_id=?"; Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, memberId); pstmt.executeUpdate(); }catch (SQLException e) { log.info("db error", e); throw e; }finally { close(con, pstmt, null); } } private void close(Connection con, Statement stmt, ResultSet rs) { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(con); } private Connection getConnection() throws SQLException { Connection con = dataSource.getConnection(); log.info("get connection={}, class={}", con, con.getClass()); return con; } }package hello.jdbc.repository; import com.zaxxer.hikari.HikariDataSource; import hello.jdbc.connection.ConnectionConst; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.jdbc.datasource.DriverManagerDataSource; import java.net.URL; import java.sql.DriverManager; import java.sql.SQLException; import java.util.NoSuchElementException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @Slf4j class MemberRepositoryV1Test { MemberRepositoryV1 repository; @BeforeEach void beforeEach() { //기본 driverManager - 항상 새로운 커넥션을 획득 // DriverManagerDataSource dataSource = new DriverManagerDataSource(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD); //커넥션 풀링 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(ConnectionConst.URL); dataSource.setUsername(ConnectionConst.USERNAME); dataSource.setPassword(ConnectionConst.PASSWORD); repository = new MemberRepositoryV1(dataSource); } @Test void crud() throws SQLException { //save Member member = new Member("memberV2", 10000); repository.save(member); //findById Member findMember = repository.findById(member.getMemberId()); log.info("findMember={}", findMember); log.info("member != findMember {}", member == findMember); assertThat(findMember).isEqualTo(member); //update repository.update(member.getMemberId(), 20000); Member updateMember = repository.findById(member.getMemberId()); assertThat(updateMember.getMoney()).isEqualTo(20000); //delete repository.delete(member.getMemberId()); assertThatThrownBy(() -> repository.findById(member.getMemberId())) .isInstanceOf(NoSuchElementException.class); } }
-
미해결실전! 스프링 데이터 JPA
JpaMetamodelEntityInformation 내부의 isNew 메서드에서 조건 분기 시 다음 조건은 무엇을 의미하나요?
public boolean isNew(T entity) { if (!this.versionAttribute.isEmpty() && !(Boolean)this.versionAttribute.map(Attribute::getJavaType).map(Class::isPrimitive).orElse(false)) { BeanWrapper wrapper = new DirectFieldAccessFallbackBeanWrapper(entity); return (Boolean)this.versionAttribute.map((it) -> { return wrapper.getPropertyValue(it.getName()) == null; }).orElse(true); } else { return super.isNew(entity); } } 조건문을 타지 않고 else 절로 넘어가면 super.isNew()를 호출하고, 상위 추상 클래스인 AbstractEntityInformation 클래스의 isNew() 메서드에서 Entity id 필드가 Null, 0L인지 판단하는 걸로 이해했습니다.강의 범위가 아니긴 하지만 JpaMetamodelEntityInformation 클래스의 isNew() 내에서 versionAttribute가 존재하는지 확인하는 부분은 어떤 것을 확인하는 것인지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
PessimisticLock을 분산락으로 활용하는 질문에 대한 답변 남기겠습니다.
github repository url: https://github.com/developer-yoni/ecommerce/tree/study/concurrency/redis여기서 study/concurrency/redis 브랜치를 확인해주시면 됩니다.StockServiceTest의 400번째 라인부터 503번째 라인까지테스트 코드가 작성되어 있습니다.큰 흐름은 동시성 이슈가 발생가능한 Stock에는 Lock을 걸지 않고,다른 Entity인 Market Entity에 PessimisticLock을 걸어,PessimisticLock을 분산락으로 활용하려는 시도 입니다.여기서 4_1 테스트는 Market에 PessimisticLock을 거는 트랜잭션과 Stock의 재고를 감소시키는 트랜잭션을 하나의 트랜잭션으로 묶었고,4_2 테스트는 별개의 트랜잭션으로 분리했습니다.이때 질문은 다음과 같습니다Q1. 동시성 이슈가 일어나지 않는 다른 Entity에 PessimisticLock을걸어 분산락처럼 활용하는게 문제가 되지 않을지 궁금합니다.혹시 문제가 된다면 , 어떤 측면에서 문제가 될지 궁금합니다.왜냐하면 어차피 동시성 이슈가 일어날 수 있는 측면의 값을 커밋하여 update함과 동시에PessmisticLock을 반환하는 것이니 문제가 되지 않을것이라고 생각했기 때문입니다.Q2. PessimisticLock을 건 트랜잭션이 커밋되거나 롤백될 때 비로소 PessmisticLock이 반환된다는 점을 근거로,4_2 테스트에서는 일부로 재고감소를 먼저 커밋한 후,Market의 PessimisticLock을 커밋하여,반드시 업데이트가 이뤄난 후 락을 반환하는것을 의도하였습니다.그러나 제 의도와 다르게 4_2 테스트는 계속 lock이 걸려있는?흐름을 보이면서 테스트에 실패합니다.그원인을 잘 모르겠습니다.바쁘신 와중에 답변 달아주셔서 감사합니다 강사님.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 초기 실행 문제
The Web Console server could not be started. Possible cause: another server is already running at http://192.168.0.25:8082Root cause: Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use: bind" [90061-224]Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientConnectionException: Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use: bind" [90061-224]at org.h2.message.DbException.getJdbcSQLException(DbException.java:690)at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)at org.h2.message.DbException.get(DbException.java:212)at org.h2.util.NetUtils.createServerSocketTry(NetUtils.java:211)at org.h2.util.NetUtils.createServerSocket(NetUtils.java:177)at org.h2.server.web.WebServer.start(WebServer.java:412)at org.h2.tools.Server.start(Server.java:548)at org.h2.tools.Console.runTool(Console.java:216)at org.h2.tools.Console.main(Console.java:72)Caused by: java.net.BindException: Address already in use: bindat java.base/sun.nio.ch.Net.bind0(Native Method)at java.base/sun.nio.ch.Net.bind(Net.java:565)at java.base/sun.nio.ch.Net.bind(Net.java:554)at java.base/sun.nio.ch.NioSocketImpl.bind(NioSocketImpl.java:636)at java.base/java.net.ServerSocket.bind(ServerSocket.java:391)at java.base/java.net.ServerSocket.<init>(ServerSocket.java:278)at java.base/java.net.ServerSocket.<init>(ServerSocket.java:171)at org.h2.util.NetUtils.createServerSocketTry(NetUtils.java:207)... 5 morecmd 에서 h2.bat 실행 시 이렇게 포트가 이미 사용중이라고 뜨는데요 포트 번호 바꿔서 사용해도 될까요? 8083 같은거로요!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 할 때 궁금한점입니다!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]테스트 코드를 작성하다가 궁금한점입니다! assertion을 사용할 때 JUnit이 아닌 AssertJ 를 추천하는 이유가 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
값을 안넘겨주면 똑같이 저도 에러가 나긴 하는데 왜 콘솔창에는 warn이 안뜰까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서는 warn이 뜨고 name이 없다라는 콘솔문구가 뜨는데 저는 창을 들어가보면 에러는 똑같이 나는데 warn이 안뜨네여..