묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
Persistence Layer(2) 강의 질문있습니다.
안녕하세요.Persistence Layer(2) 강의를 수강 중에 질문이 있습니다.먼저, 저는 h2 database 대신 mysql을 사용하기로 해서, 아래와 같이 application.yml 파일을 작성했습니다.그리고 build.gradle에 mysql import 부분 역시 등록하였습니다.spring: profiles: default: local datasource: url: jdbc:mysql://localhost:3306/testing?useSSL=false&characterEncoding=UTF-8 username: root password: [생략] driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none sql: init: mode: always --- spring: config: activate: on-profile: local jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true defer-datasource-initialization: true # (2.5~) Hibernate 초기화 이후 data.sql 실행 # h2: # console: # enabled: true --- spring: config: activate: on-profile: test jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true sql: init: mode: never 그리고 ProductRepositoryTest를 실행한 결과, @SpringBootTest 어노테이션 상에서는 테스트가 정상적으로 작동이 되나, @DataJpaTest를 사용하면 아래와 같은 오류가 발생합니다.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase. 제 생각에는, application.yml 파일 설정에서 제가 잘못 하고 있는 것 같은데요, 혹시 어느 부분을 제가 놓치고 있는지 알고 싶습니다.
-
미해결실전! 스프링 데이터 JPA
h2 데이터베이스 관련 문제
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]질문 1)실전 스프링 Data JPA -섹션 1. 프로젝트 환경설정 -스프링 데이터 JPA와 DB설정, 동작확인 강의에서H2 데이터베이스 설치 후 , 동일하게 memberJpaRepositoryTest 한 후H2 데이터베이스 다시 접속하여 확인하여도 , member table 이 생성되어 있지 않습니다.콘솔창에 찍히는걸 봤을때는 insert까지 잘 된것을 확인했습니다만무엇이 문제일까요?[Member ].classpackage com.example.datajpa.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import lombok.Getter; @Entity @Getter public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id; private String name; public Member(String name) { this.name = name; } //디폴트값으로 private 하기엔 프록시 생성시 사용되어야 함으로 protected 제어자를 통해 다른곳에서 만들지 못하도록함 protected Member() { } } [MemberJpaRepository] .class@Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; //jpa의 영속성컨텍스트를 관리 하는 엔티티메니저, 이것에 의해 데이터를 관리함. public Member save(Member member ){ em.persist(member);// 영속화 return member; } public Member find(Long id){ return em.find(Member.class,id); } }[MemberJpaRepositoryTest] .class@SpringBootTest @Transactional // 테스트가 끝난후 데이터를 롤백하기 위해 @Rollback(false) // 만약 롤백을 원하지 않을경우엔 이 어노테이션을 사용함, 실전에서는 ! 사용 노노! class MemberJpaRepositoryTest { @Autowired MemberJpaRepository memberJpaRepository; @Test public void testMember(){ //public 생략가능 Member member = new Member("memberA"); Member savedMember = memberJpaRepository.save(member); Member findMember = memberJpaRepository.find(savedMember.getId()); assertThat(findMember.getName()).isEqualTo(member.getName()); assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember).isEqualTo(member); } } [application.yml]spring: datasource: url: jdbc:h2:tcp://localhost/~/datajpa username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create # 객체를 보고 자동으로 테이블 생성 여부. 생성 - create, 비생성 - none # 테스트이기 때문에 create로 설정하며 # 실제로는 none 으로 합니다. create이면 기존의 테이블을 전부 밀어버립니다. properties: hibernate: show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug # 콘솔창에 파라미터 값을 보고 싶을때 주로 개발할때, 실전에서는 성능저하 가능성 고려하여 사용해야함. org.hibernate.type: trace #implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7' 외부라이브러리 추가하면깔끔하게 파리미터값을 보여준다. # show_sql : 옵션은 System.out 에 하이버네이트 실행 SQL을 남긴다. # org.hibernate.SQL : 옵션은 logger를 통해 하이버네이트 실행 SQL을 남긴다. [build gradle]dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' //h2사용 runtimeOnly 'com.h2database:h2' [콘솔창]insert into member (id, name) values (default, ?) insert into member (id, name) values (default, 'memberA'); 2023-05-26 18:33:03.071 INFO 3250 --- [ main] p6spy : #1685093583071 | took 0ms | commit | connection 4| url jdbc:h2:mem:ca9facbe-0495-462f-a2eb-d8f9f1d14ecd ; 2023-05-26 18:33:03.072 INFO 3250 --- [ main] o.s.t.c.transaction.TransactionContext : Committed transaction for test: [DefaultTestContext@3b0c9195 testClass = MemberJpaRepositoryTest, testInstance = com.example.datajpa.repository.MemberJpaRepositoryTest@3f6a9ba0, testMethod = testMember@MemberJpaRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@366c4480 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class com.example.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@5c86dbc5, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@5f9edf14, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@a8ef162, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@78fa769e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@536dbea0, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6b26e945], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] 2023-05-26 18:33:03.096 INFO 3250 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-05-26 18:33:03.097 INFO 3250 --- [ionShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2023-05-26 18:33:03.101 INFO 3250 --- [ionShutdownHook] p6spy : #1685093583101 | took 2ms | statement | connection 5| url jdbc:h2:mem:ca9facbe-0495-462f-a2eb-d8f9f1d14ecd drop table if exists member CASCADE drop table if exists member CASCADE ; 2023-05-26 18:33:03.106 INFO 3250 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-05-26 18:33:03.115 INFO 3250 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0 질문 2. 이 강의를 보기 전에는 h2데이터베이스 별도 설치 없이아래와 같이 Application.yml 설정과Build.gradle에 의존성만 지정하여브라우저에서 Localhost:8080/h2-console 치면 h2 데이터베이스를 사용할 수 있었습니다.하지만 이 강의를 따라 h2 설치 후엔 Localhost:8080/h2-console 해도 500에러만 발생합니다. 이유가 뭘까요 ㅠㅠ[application.yml]# h2 datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:db;MODE=MYSQL; username: sa password:[build gradle]dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' //h2사용 runtimeOnly 'com.h2database:h2'
-
미해결실전! 스프링 데이터 JPA
select 절에 조건식을 넣는 방법
강사님, 궁금한게 있습니다.select 절에 조건식을 넣고 싶은데 어떻게 해야 할까요?예)select start_post_dt, end_post_dt, news_title (now() >= start_post_dt and now() <= end_post_dt) as DateInRangefrom dummy_table;
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
JPA를 이용해서 springboot 시작 이후 Datasource설정
안녕하세요 강의 너무 잘 듣고 있습니다.개인 프로젝트를 하고 싶어서 궁금한게 생겼는데요위에 사진처럼 Datasource를 application.properties에 설정한 값 말고 트랜잭션 시작하기 전에 새로 데이터베이스 커넥션을 만들어서 처리해주고 싶습니다.jpa를 이용하고 싶은데 .properties말고 트랜잭션 시작전에 커넥션을 만들어서 JPA를 이용하려면 어떻게 해야될지 잘 모르겠습니다.autoconfiguration에서 "spring.datasource"로 들어오는 properties 설정값이나JpaBaseConfiguration으로 설정된 값을 트랜잭션 시작전에 connection을 새로 설정해서 처리할 수 있는지도 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
빈 후처리기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================섹션 7을 보면, 그냥 빈 후처리기가 있고, 스프링에서 제공하는 빈 후처리가 있는데, 그냥 민 후처리기는 스프링에서 제공하는 게 아닌건가요? 헷갈리네요ㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
@Import 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의 내용에 궁금한 점이있어 11. 스프링 AOP- 포인트컷.pdf 에 18 페이지에 있는, AtTargetAtWithinTest class에 대한 질문이 있어 글 남깁니다. @Import({AtTargetAtWithinTest.Config.class}) 를 쓰지 않고, static class Config 에 @TestConfiguration을 써도 동작하더라구요, 혹시 작동방식에있어서 차이가 있을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀 진행과정
@Test void dataSourceConnectionPool() throws SQLException, InterruptedException { //커넥션 풀림 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); dataSource.setPoolName("MyPool"); useDataSource(dataSource); Thread.sleep(1000); } private void useDataSource(DataSource dataSource) throws SQLException{ Connection con1 = dataSource.getConnection(); Connection con2 = dataSource.getConnection(); log.info("connection={}, class={}",con1,con1.getClass()); log.info("connection={}, class={}",con2,con2.getClass()); } } DriverManager.getConnection을 하면 라이브러리에서 해당 커넥션을 처리할 수 있는 DB 드라이버를 찾는 시간이 걸리고 또 커넥션을 반환하는 시간까지 걸렸습니다.애플리캐이션로직 => jdbc인터페이스 => DB드라이버 => 해당 DB 그러면 코드의 HikariCP 커넥션 풀에서 dataSource.getConnection()을 하면 커넥션 풀을 통해 이미 생성되어 있는 커넥션을 객체 참조로 쓰니까 커넥션풀에서 DB드라이버를 조회합니다.어플리케이션 로직 ⇒ 데이터소스 ⇒ 커넥션 풀 ⇒ JDBC 인터페이스 =>DB드라이버 => 해당 DB이런 식으로 진행되어서 커넥션 풀에서 커넥션(이미 DB와 연결된)을 조회,반환하는 시간이 걸린다고 이해했는데 맞게 이해했는 지 궁금합니다. 답변주시면 정말 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Result 클래스로 dto를 감싸는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. Result 클래스로 dto를 감싸는 이유는 무엇인가요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
리눅스 mysql 설치 오류 뜨시는 분들
저도 설치할 때 아래와 같은 문제가 발생 했었는데요Error: Problem: conflicting requests - nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 - nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 - nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64...... 아마존 리눅스 2023을 쓸 때는 el9 버전 레포지토리를 사용해주어야 한다고 합니다! [ wget dev.mysql.com/get/mysql80-commuity-release-e17-5.noarch.rpmrpm -ivh mysql-community-release-e17.5.noarch.rpm] 이렇게 작성하던 부분을[sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpmsudo dnf install mysql-community-server]이렇게 작성하시면 잘 설치 돼요! 출처: https://dev.classmethod.jp/articles/ec2-mysql-install-confilicting-requests-error-kr/
-
미해결토비의 스프링 부트 - 이해와 원리
통합 테스트시 각 단위테스트 실행 여부
안녕하세요.단위 테스트를 작성하여 확인한 후, 통합 테스트를 진행해보고 있습니다.궁금한 점은 통합테스트 실행시 단위 테스트들이 실행되지 않는 다는 것인데 별도의 설정이나 콜이 필요한가요? 제가 이해한 바로는 @SpringBootTest 가 붙은 통합테스트 진행시 @Test가 붙은 단위 테스트들을 contextload()에서 자동으로 실행 되는 것으로 알고 있습니다.현재 SpringBootTest쪽에는 별도의 코드가 있진 않고 빈 contextload()만 존재합니다. 조언 부탁드리겠습니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
MemberServiceTest에서 MembeService를 AppConfig에서 꺼내기 애매한 이유
24:18 쯤 MemberServiceTest.java 코드 작성 중에MembeService를 AppConfig에서 꺼내기 애매하다고 하셨는데 그 이유가 궁금합니다!@BeforeEach로 각 테스트마다 AppConfig에서 MembeService를 생성해주는게 왜 좋은지 질문드립니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
실무에서의 test DB 구성 방식이 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]기존 질문 답변을 모두 읽어 보았지만, 실무에서의 테스트 db 세팅 방법의 정확한 방향이 잡히지 않아 질문드립니다.테스트 db 환경을 로컬로도 구축하신다는 의미가 예를 들어 mysql을 사용하는 경우 로컬 mysql db에 실운영 mysql db 스키마를 등록하고 이를 test db로 사용하신다는 의미로 이해해도 될까요??h2 임베디드 db 만을 신뢰하여 통합테스트와 같은 테스트를 실행하기에는 test의 신뢰도가 떨어진다는 내용들을 봐서 실제 사용하는 db를 쓰는 것이 맞을 것 같기는 한데 위와 같은 방식으로 하면 배보다 배꼽이 더 커질 것 같아 걱정입니다.배민과 같은 좋은 기준을 가진 회사의 방식이 궁금하고 이를 적용하고 싶은데 답변만으로 어려우시다면 추후 테스트 코드 강의에 이를 반영하여 주시길 바라는 마음에서도 질문 남겨봅니다.(테스트 코드 강의 나오면 바로 구매할께요!)
-
미해결스프링부트 시큐리티 & JWT 강의
어떻게 자동으로 home으로 넘어가지나요?
로그인후 어떻게 바로 home주소로 넘어가나요?저는 로그인후 home을 직접쳐야 넘어가지던데
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원서비스테스트 강의에서 fail();이 동작안합니다
요런 에러가 뜹니다 package hello.hellospring.service;import hello.hellospring.domain.Member;import hello.hellospring.repository.MemoryMemberRepository;import org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import static org.assertj.core.api.Assertions.*;import static org.junit.jupiter.api.Assertions.*;class MemberServiceTest {//MemberService memberService = new MemberService(); //MemoryMemberRepository memberRepository = new MemoryMemberRepository(); MemberService memberService; MemoryMemberRepository memberRepository; // 동작하기 전에 MemberService에 넣어줌 @BeforeEach public void beforeEach(){// DI memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepository); }@AfterEach public void afterEach() {memberRepository.clearStore(); }@Test void 회원가입() {// given Member member = new Member(); member.setName("hello"); //member.setName("spring"); // when Long saveId = memberService.join(member); // then Member findMember = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(findMember.getName()); }@Test void 중복_회원_예외() {// given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when //try-catch 방법 try {memberService.join(member2); fail(); } catch (IllegalStateException e){assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); }/*memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));//예외가 발생해야 한다. assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");*/ }@Test void findOne() {}}해당 소스 입니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
isEqualTo()질문
isEqualTo()가 대상의 내용자체를 비교한다라고 알고 있었는데 수업시간에 isEqualTo() 내부에 equals()를 포함한다고 배웠습니다.그럼 만약 Object.equals()라면 isEqualTo()가 객체의 주소를 비교하고 , String.equals()라면 isEqualTo()가 객체의 값을 비교하나요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Item 추상화 질문 드립니다.
안녕하세요. 도메인에 있는 Item 엔티티에서 궁금한 점이 있습니다. Moive, Book, Album 클래스가 Item 클래스를 상속받고 있는데요. 그렇다면, Item에 있는 id, name, price, stockQuantity 객체를 Movie, Book, Album 클래스에서도 인스턴스 변수로 활용할 수 있는건가요? 항상 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
asserThat이 되지 않습니다.
================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]게시판에서 assertThat 관련 질문 나온 것들 다 봤는데도 assertThat이 되지 않습니다.build.gradle에 testImplementation 'org.assertj:assertj-core:3.11.1' 이것도 추가해봤지만 되질 않습니다..alt+enter를 치면 사진처럼 math어쩌구 저거만 뜹니다. 어떻게 해야할까요?
-
해결됨스프링 시큐리티 OAuth2
Spring Authorization Server 을 OAuth Client Client 로 등록
Spring Authorization Server 1.x 와 OAuthClient 를 사용하고 있습니다.강의 내용과 레퍼런스를 참조하여 Spring Authorization Server 사용하여 SSO 시스템을 개발을 진행하고 있습니다.OAuth2 Client 등록등 관리자 화면 접속을 위하여 로그인 페이가 필요한데 개발중인 SSO 시스템을 OAuth2 Client 로 등록하여 인증처리를 하기 위하여 설정 파일에 provider 로 등록하였습니다.spring: security: oauth2: client: registration: local: authorization-grant-type: authorization_code client-id: 'default' client-secret: '325ee4c4-94e9-435b-a3c4-579f84d1e211' client-name: '인증서버' redirect-uri: SSO서버URL/social-login/oauth2/code/naon-iam scope: - openid - profile provider: local: issuer-uri: SSO서버URL문제는 Spring Boot 가 기동될떄 oauth2 client 설정이 초기화 되는 과자에서 issuer-uri 에 접속을 하는데 아직 WAS 가 실행이 안된 상태이기 때문에 issuer-uri 로 ODIC Provider 정보를 가져 올떄 Connection refused 예외가 발생합니다.Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://SSO서버URL/.well-known/openid-configuration": Connection refused: no further information at org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:888) ~[spring-web-6.0.9.jar:6.0.9] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:868) ~[spring-web-6.0.9.jar:6.0.9] at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:714) ~[spring-web-6.0.9.jar:6.0.9] at org.springframework.security.oauth2.client.registration.ClientRegistrations.lambda$oidc$0(ClientRegistrations.java:163) ~[spring-security-oauth2-client-6.1.0.jar:6.1.0] at org.springframework.security.oauth2.client.registration.ClientRegistrations.getBuilder(ClientRegistrations.java:216) ~[spring-security-oauth2-client-6.1.0.jar:6.1.0] ... 178 common frames omittedyaml 의 설정을 제거 하고 Java Config 에서 등록을 하면 @Bean public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository(this.localRegistration()); } private ClientRegistration localRegistration() { return ClientRegistration.withRegistrationId("local") .clientId("google-client-id")순한 참조 예외가 발생합니다.Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'clientRegistrationRepository': Requested bean is currently in creation: Is there an unresolvable circular reference? at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:355) ~[spring-beans-6.0.9.jar:6.0.9] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:227) ~[spring-beans-6.0.9.jar:6.0.9]Spring Authorization Sever 와 충돌의 의심해보았는데 RegisteredClientRepository 로 등록하거 있어 원인을 아닌거 같고 ClientRegistrationRepository 을 등록하는 코드에 문제가 있는거 같이 문의 합니다.개발은 Spring Authorization 1.1 로 진행하고 있습니다. OIDC Logout Endpoint 기능이 필요하여 지난주에 Spring Authorization 1.0.2 -> 1.1 로 업그레이드 하였습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서로 다른 도메인을 가진 repository에 대해서
안녕하세요강의를 듣고 토이프로젝트를 진행 중인데 고민이 있어서 여쭤봅니다.한개는 고객을 담당하는 레포지토리고, 한개는 방명록을 담당하는 레포지토리입니다.// 고객 레포지토리 public class MemberRepository{ public void save(Member member){ sqlSession.insert("com.example.toy.mapper.MemberMapper.save", member); } } // 방명록 레포지토리 public class BoardRepository { public void save(Board board){ sqlSession.insert("com.example.toy.mapper.BoardMapper.save", board); } }서로 기능이 거의 비슷해서 추상화를 통해 의존성 주입을 받고 싶은데 파라미터의 타입이 달라서 못하는 상황입니다.여기서 파라미터의 타입을 아예 Object로 하는게 좋은지, 아니면 이런 경우에는 인터페이스로 추상화를 할수 없는 건지 궁금합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
loginForm.html에서 form태그 action 속성에 관해 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 [질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강사님 지금 loginForm.html에서 form태그 action 속성이 "item.html"로 되어 있는데 "/login"으로 해줘야 loginController에서 login post 요청으로 인식하여 loginService가 진행되지 않나요?