묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.어떤 점이 문제인지 모르겠습니다 ㅜ jdbcMemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class JdbcMemberRepository implements MemberRepository{ private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } } MemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); void finById(Long id); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); void cleatStore(); }MemoryMemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import java.util.Map; import java.util.Optional; import java.util.*; public class MemoryMemberRepository implements MemberRepository { public static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId((++sequence)); store.put(member.getId(), member); return member; } @Override public void finById(Long id) { } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable((Member) store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public void cleatStore() { } void clearStore() { store.clear(); } }errorerror: JdbcMemberRepository is not abstract and does not override abstract method cleatStore() in MemberRepository public class JdbcMemberRepository implements MemberRepository{
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이런 오류가 뜨는데 대체 어떻게 해결해야 할까요? ㅠㅠpackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class JdbcMemberRepository implements MemberRepository{ private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } } error: JdbcMemberRepository is not abstract and does not override abstract method cleatStore() in MemberRepository public class JdbcMemberRepository implements MemberRepository{
-
해결됨실전 jOOQ! Type Safe SQL with Java
from절 subquery table filed nullable 처리
안녕하세요. 강의 잘 듣고있습니다.다름이 아니라 subquery 실습 중 nullable method 처리가 안되어 질문 드립니다. asTable() method 사용하여 Table<Record> 인스턴스 subTable 생성 후 subTable.field() method 호출 시 Nullable한 method이기 때문에 NPE 발생 가능 경고가 발생합니다. 서브쿼리가 아닌 generated된 객체의 경우에는 발생하지 않아 비슷한 방식으로 해결해보기 위해 구글링해보았지만 뚜렷한 해결방법이 나오지 않아서요. 특정 객체로 mapping 혹은 NPE 발생 가능성을 compile level에서 처리 가능하게끔 해결 가능할까요?
-
미해결장애 없는 서비스를 만들기 위한 Resilience4j - CircuitBreaker
Resilience4J 적절한 적용 예시인지 질문드립니다.
안녕하세요 🙂 Resilience4J 를 학습한 후 실무에 적용해보려 하는 주니어 백엔드 개발자입니다.제가 생각하는 예시가 서킷 브레이커를 도입하기 적절한 예시인지 궁금해서 질문을 남깁니다! 현재 제가 고려하는 상황입니다.A 서버 혹은 B 서버로 요청을 보내도 되는 상황 (A서버로 요청 보내는 것이 비용이 저렴하기 때문에 기본적으로 A사 요청)A사로 요청을 보냈지만 장애 발생 -> 서킷 OPEN 상태로 변경 서킷이 OPEN일 때 B 서버로 요청HALF OPEN일 때 A서버로 요청을 보냄A서버에서 정상적인 응답이 올 경우 서킷 CLOSE이러한 방식으로 Resilience4J를 도입하려고 하는데, resilience4J가 개발된 의도에 맞게 사용하는걸까요?혹시 아니라면, 다른 어떤 방법을 사용하면 좋을지 궁금해서 질문 남기게 되었습니다
-
미해결스프링 배치
Transition - on() / to() / stop(), fail(), end(), stopAndRestart() 강의의 38:39에 대한 내용 질문
FlowJob에 대한 강의를 듣다가궁금한 점이 있어서 질문드립니다. from()에 관한 질문인데요,from()의 역할이 현재 트랜지션에서 벗어나새로운 트랜지션을 다시 재정의하는 것으로 이해했습니다. 그래서 38:39 부분에서,step1()은 처음에 start()에서 정의하고,30번 째 라인에서, 다시 step1()의 기준을 재정의하FAILED가 아닌 모든 경우에 대한 flow를 재구성하는 것으이해했습니다. 질문은 step2()에 관한 것입니다.step2()는 첫번째 트랜지션인]on("FAILED") 하위에 to()를 통해서 최초에 정의되었습니다. 하지만, 그리고 step2()는 "FAILED" 상태인 경우에,FlowJob을 Stop하고 그 결과로 Job을 상태를 Stopped로 만듭니다. step2의 중점 Flow는step1() -> FAILED -> step2() -> FAILED -> STOPED인 것을 알 수 있습니다. 그런데, 34번 라인에서 다step2를 가져와서 이전에 정의 FAILED를 제외한 나머지 경우를 진입시키는 Transtion을 작성하였습니다. 코드만 보면, 계층이 step1과 나란한 구조라서,헷갈릴 것 같습니다. 그래서, 저는 34~36번 라인의 코드를,29번 라인 이후에,작성해도 같은 결과를 보장하는지 궁금합니다. from절이 어디에 사용돼도,항상 from절 내부에 있는 StepBean을 기준으다시 flow가 재정의 된다고 봐도 되는걸까요?
-
미해결스프링 시큐리티 OAuth2
OAuth 2.0 Grant Flows 관련 질문
안녕하세요. OAuth 2.0을 배우고 싶어 학습 신청했습니다.유익한 강의 준비해주셔서 감사합니다.막연하게 알고 있는 Spring Security 에 대해 강의를 통해 명확하게 알아가고 있습니다. 강의를 들으며 몇가지 궁금한 점이 있어 질문드립니다. 우선은 자체 로그인만 구현할 예정이라면,소셜 로그인 기능이 없는 경우에는 OAuth 2.0을 도입할 필요가 없는 건가요?Resource Owner Password Credentials Grant Flow 는 Deprecated 된다고 하는데 그럼 어떻게 구현해야하나요? 답변주시면 성장하는데 큰 도움이 될 것 같습니다!감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티 조회와 DTO조회
엔티티 조회를 권장하신다고 했는데 엔티티 조회로 처리 안 되는 경우가 있나요? 엔티티로 조회한 결과를 DTO로 변환해서 넘기는게 가장 좋은 방법 아닌가요??
-
미해결코드로 배우는 React with 스프링부트 API서버
섹션 4 리액트와 API서버 통신 조회기능 구현 화면 차이 문의 건
안녕하세요. 질문이 있습니다.섹션 4 리액트와 API서버 통신에서 조회기능 구현을 실행하였습니다.강사님 화면과 달리 저의 화면은 아래와 같이 나옵니다.위 부분중 차이 나는 부분을 아래 다시 캡춰했습니다.현재 스프링 부트는 아래와 같이 실행되고 있습니다.조금 확대해서 다시 아래 다시 캡춰했습니다.강사님은 한 화면에서 두개가 나오는 거 같은데요.제가 어떤걸 수정해야 하는지 알고 싶습니다.위 섹션 4 리액트와 API서버 통신에서 조회기능 구현에서 최초 연결 확인하는 부분까지 코드는 강의에 나온데로 진행하였습니다.부탁드립니다. 감사합니다.
-
미해결예제로 배우는 스프링부트 입문
java Code로 DI 사용하기
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. "java Code로 DI 사용하기" 영상의 설정 완료 후 서버 재시작했는콘솔창에 bean이 출력이 안되는데 이유가 뭘까요?콘솔창에 아무것도 출력이 안됩니다.직접 설정도 해보고 소스코드 복사해서도 해봤는 계속 안되네요 package com.study.springboot; import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.study.springboot.bean.Config; //@SpringBootApplicationpublic class JavaCodeDi1Application { public static void main(String[] args) { // SpringApplication.run(JavaCodeDi1Application.class, args); ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);}}
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
open or import
제가 이 강의 듣기 전 java 인강도 듣고 있던 터라 인텔리제이에서 open or import 버튼을 누르지못하는데요 (초기화면으로 돌아가지 못해요) 혹시 인텔리제이를 삭제했다가 다시 깔아야 하나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Hibernate 질문 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]17 :13 에서 MemberServiceIntegrationTest 의 회원가입을 실행했을 때 김영한님은 insert into member(id,name) values (null,?) 라고 뜨시는데 저는insert into member (name, id) values (?,default) 라고 뜹니다 member 과 values 둘 다 순서가 바뀐 것 같은데 어디를 봐야 고칠 수 있을까요..?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
anyRequest().access(매니저) 질문!
강사님 안녕하세다음과 같은 코드에서.anyRequest().authenticated()는 따로 안해줘도 되는건가요? 음 그러니깐 궁금한것이 원래 하드코딩으로 설정하게되저희가 권한규칙 부여한것외의 엔트리포인트는 모두 인증되어야한다고 설정해줘야하잖아요!1근데 저렇게 매니저를 넣어주게되면 ?저것외의 엔트리포인트는 인증되어야한다는 어디서 처리하게되는지 궁금해요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ToOne은 왜 한 번만 땡겨오나요?
안녕하세요 강의 설명중에 ToOne은 한번만 땡긴다고 하셨는데 이유가 주문당 멤버랑 배송은 하나만 있으니까 한번만 가지고 온다고 하신걸까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
jwt와 oauth2 활용!
강사님 안녕하세요! 제가 강의를 다듣고 jwt와 oauth2를 활용해서 연습해보려고하는데요! 혹시 jwt와 oauth2를 사용하려면 넣어야하는 그래들 의존성이라든지 기타 조언해주실점 있으면 받고싶습니다!
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
4.1 마지막 회원가입 실행되지만 빈화면 뜸
오류없이 실행은되는데 계속 이렇게 아무것도 결과가 안나옵니다.봐도봐도 모르겠어 프로젝트 파일 남겨봅니다.https://drive.google.com/file/d/1UngsyVj2InuB9bJWA6hpdcjhMBkXI9w3/view
-
미해결스프링 배치
job launcher관련 질문 있습니다.
joblauncher 동기적 방식 설명을 보면 controller 를 하나 만들job di 로 받고 있는데요 job 이 여러개 있는 경우 예를 들어 a, b, c 3개의 잡이 있을 때 controller 에 a job 을 전달하려면 어떻게 해야되나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
중복_회원_예외 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 뭐가 문제인지 모르겠습니다 ㅠㅠ isEqualto도 빨간색으로 뜨면서 작동이 안되고요 ㅠㅠpackage hello.hello_spring.service; import hello.hello_spring.domain.Member; import hello.hello_spring.repository.MemoryMemberRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberService memberService = new MemberService(); MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository(); @AfterEach public void afterEach() { memoryMemberRepository.cleatStore(); } @Test void 회원가입() { //given Member member = new Member(); member.setName("hello"); //when long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); //ctrl + alt + v assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외() throws Exception { //given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //when Long saveId = memberService.join(member1); //then IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); assertThat(e.getMessage().isEqualTo("이미 존재하는 회원입니다.")); /* try { memberService.join(member2); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage().equals("이미 존재하는 회원입니다.")); } */ } @Test void findMembers() { } @Test void findOne() { } }Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.RuntimeException> Expected :class java.lang.IllegalStateException Actual :class java.lang.RuntimeException <Click to see difference> org.opentest4j.AssertionFailedError: Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.RuntimeException> at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:67) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:35) at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3115) at hello.hello_spring.service.MemberServiceTest.중복_회원_예외(MemberServiceTest.java:53) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:28) at java.base/java.util.Optional.ifPresent(Optional.java:178) at hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:24) at hello.hello_spring.service.MemberService.join(MemberService.java:16) at hello.hello_spring.service.MemberServiceTest.lambda$중복_회원_예외$0(MemberServiceTest.java:54) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:53) ... 6 more Caused by: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:26) ... 11 more java.lang.IllegalAccessException: 이미 존재하는 회원입니다. java.lang.RuntimeException: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:28) at java.base/java.util.Optional.ifPresent(Optional.java:178) at hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:24) at hello.hello_spring.service.MemberService.join(MemberService.java:16) at hello.hello_spring.service.MemberServiceTest.lambda$중복_회원_예외$0(MemberServiceTest.java:54) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:53) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:35) at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3115) at hello.hello_spring.service.MemberServiceTest.중복_회원_예외(MemberServiceTest.java:53) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:26) ... 11 more
-
미해결코드로 배우는 React with 스프링부트 API서버
AccessDeniedHandler가 작동하지않습니다
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { 생략... SecurityContextHolder.getContextHolderStrategy().getContext().setAuthentication(token); filterChain.doFilter(request, response); } catch (Exception e) { log.info("---------------JWT ERROR!------------"); log.info(e); log.info(e.getMessage()); ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(Map.of("error", "ERROR_ACCESS_TOKEN")); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.println(jsonStr); writer.close(); } }강의의 JWT와 @PreAuthorize 이용하기 파트 후반부에 강의처럼 USER권한만 가진 사용자로 ADMIN권한이 필요한 메소드에 접근하니 포스트맨에서 AccessDenied exception이 뜨지않고 catch (Exception e)가 예외를 잡아버려서 { "error": "ERROR_ACCESS_TOKEN" }결과가 이렇게 나옵니다 이미 AccessDenied 핸들러도 시큐리티에 등록 시킨후 입니다ADMIN권한을 가진 사용자 토큰으로 요청을 보내면 원하는 데이터도 잘 나옵니다 catch로 잡아서 예외를 던질까 시도해봤는데 이유는 모르겠지만 Exception에서만 예외가 잡힙니다ㅠ그래서 여러가지 해결책을 알아봤는데첫번째catch (RuntimeException e) { log.info("---------------JWT ERROR!------------"); log.info(e); log.info(e.getMessage()); ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(Map.of("error", "ERROR_ACCESS_TOKEN")); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.println(jsonStr); writer.close(); }이렇게 RuntimeException으로하면{ "error": "ERROR_ACCESSDENIED" }AccessDenied 핸들러가 잘 작동하구요 두번째SecurityContextHolder.getContextHolderStrategy().getContext().setAuthentication(token); } catch (Exception e) { log.info("---------------JWT ERROR!------------"); log.info(e); log.info(e.getMessage()); ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(Map.of("error", "ERROR_ACCESS_TOKEN")); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.println(jsonStr); writer.close(); } filterChain.doFilter(request, response);doFilter를 try catch 밖에 두어도 AccessDenied 핸들러가 잘 작동합니다세번째@ExceptionHandler(AccessDeniedException.class) public ResponseEntity<?> notAuthorized(AccessDeniedException e) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage()); }RestControllerAdvice로 하면 핸들러가 작동안하긴해도 예외처리가 가능했습니다근데 문제는 왜 원래코드에서 영상처럼 작동을 안하는지 이유를 모르겠습니다 제가 빠트린부분이 있을까요?스프링부트 버전도 똑같이 맞춰보기도 했습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품주문_재고수량초과() 질문
@Test public void 상품주문_재고수량초과() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 11; //재고보다 많은 수량 //When assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), orderCount)); //Then fail("재고 수량 부족 예외가 발생해야 한다."); }이렇게 작성할 경우, fail()문을 넣으면 테스트오류가 뜨는데 없애는 게 맞나요, 안넣으면 오류가 안떴을 경우를 어떻게 확인하나요??
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
실전강의 질문 (Rest 인증 필터 구현)
인증 필터에 왜 authenticationManager를 굳이 셋해주는지 궁금합니다!!..