묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 처리하기 - 세션 동작 방식 파트 질문입니다.
중요한 정보는 모두 서버에 저장해야 한다고 써있는데, 만약 서버가 공격받게 된다면 이 정보가 모두 노출될텐데, 서버가 공격받는 것은 어떻게 예방할 수 있나요? 예시 몇 가지만 들어주시면 감사하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
앞으로의 방향
[질문 내용]안녕하세요!! 우선 좋은 강의 만들어주셔서 너무 감사합니다! 이번 강의도 정말 잘 들었습니다!! 저는 자바 입문, 실전 자바 기본편을 듣고 이번 스프링 입문 강의를 완강했습니다. 이전에는 자바에 대해 책으로 공부하고 강의를 통해 이해하는데 큰 어려움이 없었지만 스프링은 처음이라 많이 헤매는 느낌을 받습니다. 궁금한 점은 헤매는 느낌을 받는 이유는 자바에 대한 이해가 부족해서 인지 스프링에 대한 이해가 부족해서 인지 알고싶습니다. 또한 제 계획은 24년도 상반기에 나올 자바 중급,고급 강의를 듣고 스프링 완전정복 강의를 듣고 토이프로젝트를 통해 실력을 향상시키는 것이 목표입니다. 이 방향성이 괜찮은지 아니면 어떤 방향으로 나아가야하는지 조언 부탁드립니다.!! 처음 자바를 공부하고 너무나도 헷갈리고 어려운 순간들이 많았는데 김영한 선생님의 강의를 듣고 나름대로 발전한 것 같아서 항상 감사하고 있습니다. 양질의 강의를 제공해주셔서 감사합니다 !! 24년도 잘 부탁드립니다!!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
영상처럼 한번에 국제화 보고 수정하는 방법
질문은 아니고 저처럼 다른 분들도 찾을까봐 남깁니다이렇게 보시는 부분이 있는데저도 저렇게 보고싶어서 찾아보니플러그인에서 검색으로 Resource bundle edit 이 플러그인을 설치하면 되더라구요
-
미해결스프링 부트 - 핵심 원리와 활용
순수 라이브러리 만들기에서 memory.jar의 의존성 문제
순수 라이브러리 만들기에서 memory.jar를 외부 라이브러리로 만들때, 여기서 참조된 라이브러리가 jar파일에 포함되지 않을 것 같은데요.만약 memory.jar안에서 사용된 라이브러리가 참조한 프로젝트에 없을때 참조 오류가 발생할텐데…memory.jar안에 참조로 사용된 라이브러리를 포함하려면 어떻게 해야 할까요?저의 경우 프로젝트를 작은 단위로 나누어 프로젝트로 구성하고 autoconfiguration을 적용하려고 하는데 .. 참조하는 프로젝트에서 사용하지 않는 참조를 사용하는 경우가 다수 발생합니다. 좀더 자세한 상황을 첨부 합니다. memory.jar 에서 이 프로젝트에서만 사용하는 inflearn.jar를 참고하고 있습니다. 이 경우 memory.jar를 패키징하면 spring에서 사용하는 기술을 사용하지 않기 때문에 jar에 jar를 포함하지 못하고 fat jar로 빌드하지 않으면 inflearn.jar가 포함되지 않을 텐데요.그렇게 되면 memory.jar를 참조하는 프로젝트에서 inflearn.jar가 없어 오류가 발생할 것 같습니다. 또한, 그 반대로 위 문제 때문에 fat jar로 패키징하는 경우 참조하는 쪽의 라이브러리와 같은 라이브러리로 사용으로 충돌이 발생하는 문제는 없는지요..? 죄송하게도 제가 두 경우를 충분하게 테스트 후 질문을 드리려고 했으나 샘플을 구성하고 여러가지 시도 후 질문 하려면 너무 많이 시간이 걸릴 것 같아 (제가 만들 샘플의 해답이 정답인지도 확인이 어려움) 먼저 질문 올리고 제 생각처럼 실제 오류가 발생하는지는 테스트 하고 문제를 해결할 수 있는지도 같이 보도록 하겠습니다. 감사합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
긴 작업일 경우 트랜잭션을 걸지 말아도 된다는 점이 이해가 잘 안갑니다.
안녕하세요. 테스트 코드를 수강하고 있는 학생입니다. 긴 작업일 경우 트랜잭션을 걸지 말라고 하셨는데. 조회용 트랜잭션이 Repository 단에서 걸린다는 말씀을 하셨는데 Repository의 조회 로직이 수행될 때 트랜잭션이 걸리는 건가요? 뭔가 잘못 이해한거 같기도 해서 질문합니다. 그리고 @RequiredArgsConstructor @Service public class MailService { private final MailSendClient mailSendClient; private final MailSendHistoryRepository mailSendHistoryRepository; public boolean sendMail(String fromEmail, String toEmail, String subject, String content) { boolean result = mailSendClient.sendEmail(fromEmail, toEmail, subject, content); if (result) { mailSendHistoryRepository.save(MailSendHistory.builder() .fromEmail(fromEmail) .toEmail(toEmail) .subject(subject) .content(content) .build() ); return true; } return false; } } 여기서는 Transaction을 걸어줘야 하는게 맞는거 같아서.이 부분도 궁금합니다. 요약저는 서비스 Layer에서 Transaction을 걸어 db작업에서 문제가 발생했을 경우 rollback 되어야 한다고 생각했습니다.강의에서 긴 작업들이 실제로 트랜잭션에 참여하지 않아도 되는데 -> OrderStatisticsService에서는 CUD작업이 아니니깐 Transaction을 안 걸어도 된다.?MailService에서는 Transaction을 걸어줘야 하는게 아닌가요? (Create 작업 수행)조회용 트랜잭션이 Repository 단에서 걸린다.? 뭔지 잘 모르겠습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 이해 강의에서 DB연결 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 김영한 선생님 안녕하세요. JDBC 이해에서 데이터베이스를 연결하려고 하는데 계속 에러가 납니다. 에러내용 java.lang.IllegalStateException: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use: "C:/Users/SeoCom1/testDB.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-224] at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:17) at hello.jdbc.connection.DBConnectionUtilTest.connection(DBConnectionUtilTest.java:10) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use: "C:/Users/SeoCom1/testDB.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-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.mvstore.db.Store.convertMVStoreException(Store.java:165) at org.h2.mvstore.db.Store.<init>(Store.java:142) at org.h2.engine.Database.<init>(Database.java:326) at org.h2.engine.Engine.openSession(Engine.java:92) at org.h2.engine.Engine.openSession(Engine.java:222) at org.h2.engine.Engine.createSession(Engine.java:201) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125) at org.h2.Driver.connect(Driver.java:59) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:11) ... 4 moreCaused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/SeoCom1/testDB.mv.db [2.2.224/7] at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) at org.h2.mvstore.MVStore.<init>(MVStore.java:286) at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) at org.h2.mvstore.db.Store.<init>(Store.java:133) ... 14 moreProcess finished with exit code -1 이렇게 코드가 나오는데Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use: "C:/Users/SeoCom1/testDB.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-224]<-이 부분이 원인이 되는 이유인 것 같더라고요.... 구글링으로 최대한 해결해보려고 했는데 결국 어떻게 바꿔야할지 감이 잡히지 않습니다.
-
미해결
Spring Framework 강의중 IntelliJ - maven조합 추천좀 해주세요
안녕하세요현재 국비학원에서 스프링프레임워크를 듣는 수강생인데요너무 날라치기로 mvc패턴까지 알려주고 계셔서 , 나름 개인공부를 하고자 인프런에서 강의구매를 하려고 합니다 우선 스프링은 지금 처음 만져본거고boot는 추후에 결제해서 볼꺼구요.프페임워크에 대한 수강을 듣고싶어요그리고 제가 m1맥북을 쓰는데 원래 학생혜택으로 인텔리제이 울티를 쓰고있어서자바수업때부터 계속 인텔리제이를 썼는데요학원에선 이클립스로 수업진행을 하다보니 환경구축하는게 어렵더라구요..어디서 어디까지가 구축인지도 모르겠고STS3 다운받았더니 계속 오류에 이클립스도 햇더니 오류가 계속 나서어쩔 수 없이 인텔리제이로 해야할 것 같아요 . 괜찮은 수업 아시는분 계시면 추천 부탁드립니다ㅜㅜ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult 메시지 처리에 대해서 질문있습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]errors.properties의 {0}, {1} 등에 숫자가 들어간 형태로 출력되는 것 같은데 숫자 출력 포맷이 기본적으로 #,###인가요?따로 어떠한 작업 없이 숫자만 들어간 것 같은데 아래처럼 #,###로 숫자가 출력이 되길래 궁금해서 질문드립니다.만약 그렇다면 숫자 구분자 없이 기본 형태로 숫자를 출력하고 싶으면 어떻게 해야하나요아래는 addItemV3를 만든 후 출력된 결과입니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring 3.xx버전 querydsl gradle 설정 관련 질문
QueryDSL 소개 강의 영상에서 gradle 설정하는 부분을 3이상버전 관련해서 올려주신 자료를 보면서 따라했는데 build-clean을 하고 해봐도 tasks-others밑에 compileQuerydsl파일이 생성되 지않아서 comlile.java 를 눌렀더니 generated에 파일들은 잘 생성됐습니다. plugins { id 'java' id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' //Hibernate5JakartaModule 등록 (하이버네이트 모듈) implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //QueryDsl 관련 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } def querydslSrcDir = 'src/main/generated' clean { delete file(querydslSrcDir) } tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory = file(querydslSrcDir) } 이렇게 작성했는데 혹시 틀린 부분이 있을까요?
-
미해결Java/Spring 주니어 개발자를 위한 오답노트
외래키를 지양하라는 질문에 대한 궁금증
외래키 사용을 지양하라는 내용이 있어서 링크된 글을 읽어봤는데 궁금증이 있습니다. 외래키를 지양한다면 PK 값을 다른 테이블에 넣으면서 그 값으로 조인을 사용하는건가요?외래키를 지양했을 때 성능상의 이점은 알겠는데 결국 데이터 정합성 부분에서 문제가 발생합니다. RDB에서 데이터 정합성이 깨지면 사용하는 의미가 없다고 하는데 이부분에선 어떻게 생각하시나요?외래키를 안쓸경우 JPA에서 ManyToOne같은 메소드도 사용하지 않는건가요?그리고 해당 주장에 대해 반박하는 아래의 링크도 있는데 이 의견은 어떠신가요?https://gdsc-university-of-seoul.github.io/foreign-key/
-
미해결스프링 부트 - 핵심 원리와 활용
IntelliJ무료버전 톰캣 실행이 안됩니다.
Smart Tomcat을 사용해서 실행하는데java.io.FileNotFoundException: C:\Users\...\smart-tomcat\conf\server.xml (지정된 파일을 찾을 수 없습니다) 발생합니다.경로가 Catalina base에 자동으로 채워지는 부분이었어요..어떻게해야될까요?
-
해결됨Java 마이크로서비스(MSA) 프로젝트 실습
직접 어플리케이션 서버에 요청을 보내면 동작하는데, gateway 서버로 보내면 404가 뜹니다
config-server / eureka-server / gateway-server /그리고 item-service-server 대신에 제가 만드는 rms라는 애플리케이션 서버를 띄웠습니다.게이트웨이 서버를 통해서 http 요청을 보내면 404가 뜨고직접 애플리케이션 서버로 요청을 보내면 잘 동작하는 상태입니다.그래서 config-server의 gateway-server-local.yml 파일에서 spring.cloud.gateway 부분에 문제가 있을거라 추측하고 계속 찾아봤는데... 어떻게 변경해야 할지.. 잘 모르겠어서 질문드립니다. 일단 파일 전체를 공유하겠습니다.config-serverresources.application.ymlspring: application: name: config-server profiles: active: native cloud: config: server: native: search-locations: classpath:/config encrypt: enabled: false server: port: 8080 resources.bootstrap.ymlencrypt: key: IRON0000 resources.config.eureka-server-local.ymllogging: file: name: logs/eureka.log max-size: 500MB max-history: 10 level: root: info org.com.iron.eureka-server: debug spring: application: name: eureka-server server: port: 8761 eureka: instance: hostname: eureka-server client: serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ register-with-eureka: false fetch-registry: false management: endpoints: web: exposure: include: "*" resources.config.gateway-server-local.ymllogging: file: name: logs/gateway-local.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: application: name: gateway-server cloud: gateway: routes: - id: rms uri: lb://rms eureka: instance: prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka resources.config.rms.ymllogging: file: name: logs/api.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: datasource: url: jdbc:h2:tcp://localhost/~/server-iron username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true default_batch_fetch_size: 1000 #최적화 옵션 mybatis: mapper-locations: mybatis/mappers/*.xml springdoc: default-consumes-media-type: application/json default-produces-media-type: application/json swagger-ui: operations-sorter: alpha disable-swagger-default-url: true display-query-params-without-oauth2: true resources.config.rms-local.ymllogging: file: name: logs/rms-local3.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: datasource: url: jdbc:h2:tcp://localhost/~/server-iron username: sa password: '{cipher}' driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true default_batch_fetch_size: 1000 #최적화 옵션 mybatis: mapper-locations: mybatis/mappers/*.xml springdoc: default-consumes-media-type: application/json default-produces-media-type: application/json swagger-ui: operations-sorter: alpha disable-swagger-default-url: true display-query-params-without-oauth2: true token: expiration_time: 86400000 secret: IRON0000 eureka: instance: instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}} prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka eureka-server.ymlresources.bootstrap.ymlspring: application: name: eureka-server profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false gateway-serverresources.bootstrap.ymlserver: port: 8070 spring: application: name: gateway-server profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false management: endpoints: web: exposure: include: refresh, health, beans rmsresources.bootstrap.ymlserver: port: 0 spring: application: name: rms profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false refresh: extra-refreshable: com.zaxxer.hikari.HikariDataSource management: endpoints: web: exposure: include: refresh, health, beans build.gradle 파일들도 올려야할까요...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
맥 h2 db 실행오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]맥 터미널에서 권한 부여까지 한후 실행을 했는데./bin/h2.sh: line 3: 3667 Trace/BPT trap: 5 java -cp "$dir/h2-2.2.224.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"이와 같은 메세지가 뜨면서 아예 화면도 안뜨네요ㅜㅜ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Response DTO VS HTTP Response
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 잘 듣고 있습니다.강의 도중 궁금한 점이 생겨 질문드립니다. 강의에서는 POST나 PUT요청에서도 Response DTO 객체를 생성해서 전달하셨는데, 실제 실무에서도 이렇게 하는지 궁금합니다. 질문드린 이유는 HTTP Response code상 201이나 204 등의 응답코드가 있는 것으로 알고있는데, Response를 매번 생성하는게 실질적으로 좋은 설계이기 때문인지, 아니면 변경이 완료된 것을 실제로 조회하면서 이해를 돕기 위함인지 궁금했습니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
members/new 회원가입 whitelabel 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]안녕하세요, localhost:8080/members/new에 접근하면 whitelabel에러가 떠서 이유가 무엇인지 질문 드립니다.오타같은 것도 없고 구조도 정확한 것 같은데 어떤 부분이 문제인건지 전혀 모르겠습니다... hello.hellospring/controller/HomeControllerhello.hellospring/controller/MemberController resources/templates/home.html resources/templates/members/createMemberForm.html폴더 구조 실행 결과
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오류 발생 시 Postman에서 항상 JSON형식으로 반환됩니다.
error/500.html 을 만들고@RequiredArgsConstructor @Controller public class ProductController { @GetMapping("/api/response") public String responseStatusEx1() { throw new RuntimeException(); } }위와 같이 연습코드를 작성하면 웹페이지에서는 제가만든 500오류페이지가 나오는데 PostMan에서는{ "timestamp": "2023-12-19T03:41:17.680+00:00", "status": 500, "error": "Internal Server Error", "path": "/api/response-status-ex1" }Accept: text/html이면 잘 나오나 Accept: */* 이면 위와같이 항상 Json형식으로 나옵니다. 우선순위가 Json형식이 높아서 그런건지 알려주시면 감사하겠습니다.
-
미해결스프링 핵심 원리 - 고급편
다중 상속
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]인스턴트에 인터페이스가 있다면 JDK 동적 프록시를 사용하고 그렇기 때문에 "proxyFactory.getProxy()"의 반환값을 인터페이스로 타입 캐스팅할 수 있다고 알려주셨습니다. 그런데 만약이 객체가 인터페이스를 다중 상속하고 있다면 어떻게 동작하나요? 예를 들어서이런 예제가 있다고하면 InterfaceImpl는 A와 B 인터페이스를 모두 구현한 건데 JDK 동적 프록시는 InterfaceImpl이 A를 구현한건지 B를 구현한건지 어떻게 구분할까요?참고로 test 코드를 작성해보니 A와 B 둘다 타입 캐스팅이 되네요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
ConnectException이 잡히지 않는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]checked() 테스트에서 아래와 같이 isInstanceOf(SQLException.class)를 ConnectException.class로 변경하면 왜 테스트가 통과되지 않는지 궁금합니다 ! @Test void checked() { Controller controller = new Controller(); Assertions.assertThatThrownBy(() -> controller.logic()) .isInstanceOf(ConnectException.class); }public void logic() throws SQLException, ConnectException { service.logic(); } service.logic()에서 두 예외가 다 밖으로 던져졌으니 테스트에서도 ConnectException가 발생하는게 아닌가요?
-
미해결스프링 핵심 원리 - 기본편
@PostConstruct어노테이션의 초기화 콜백 메서드에 대해서 확답이 필요합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요!초기화 콜백에 관한 강의를 듣고 정리해본 결과 지금 예제에서는 외부에서 주입 받는 객체가 없기 때문에 의존성 주입은 없고 url필드의 값 주입만 있는 것 같습니다.그런데 @PostConstruct 어노테이션의 역할은 설정 정보에 있는 빈 객체가 생성되고, 빈 간에 의존성이 모두 주입된 직후 실행될 초기화 콜백 메서드를 지정하는 것이라고 이해했습니다.이때 예제에서처럼 실질적으로 의존성이 존재하지 않아도 해당 어노테이션이 붙어있는 메서드가 있다면, 빈 생성 후 필드 값 주입을 마치고 똑같이 초기화 콜백을 수행하는 것이 맞나요?그리고 @PostConstruct어노테이션의 쓰임으로는 어떠한 의존성이나 필드에 대해서 생성자로 초기화하기 까다롭거나 적절하지 않을 때, 혹은 그래야만 하는 상황에(앞서 생성자를 통해 의존성을 주입받아야만 사용할 수 있는 의존성(필드)일 때) 추가적으로 초기화하기 위해 사용하는 걸로 이해해도 될까요?
-
미해결스프링부트 시큐리티 & JWT 강의
authenticationManager 관련 질문입니다.
안녕하세요 늘 좋은 강의 올려주셔서 감사합니다.authenticationManager 파라미터 전달 부분에서 문제가 있어 이렇게 게시글 남깁니다!새로 올려주신 소스코드를 보며 새로 업데이트된 시큐리티에서 사용하기위해 authenticationManager 를 파라미터로 전달하는 부분을 적용하였습니다 그런데Authentication authentication = authenticationManager.authenticate(authenticationToken);부분에서 loadbyUsername() 함수를 호출하지 못하고 있습니다... JwtAuthenticationFilter// 유저네임 패스워드 토큰 생성 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( loginUser.getUsername(), loginUser.getPassword() ); System.out.println("JwtAuthenticationToken : 토큰생성완료"); // authenticate() 함수가 호출 되면 인증 프로바이더가 유저 디테일 서비스의 // loadUserByUsername(토큰의 첫번째 파라메터) 를 호출하고 // UserDetails를 리턴받아서 토큰의 두번째 파라메터(credential)과 // UserDetails(DB값)의 getPassword()함수로 비교해서 동일하면 // Authentication 객체를 만들어서 필터체인으로 리턴해준다. // Tip: 인증 프로바이더의 디폴트 서비스는 UserDetailsService 타입 // Tip: 인증 프로바이더의 디폴트 암호화 방식은 BCryptPasswordEncoder // 결론은 인증 프로바이더에게 알려줄 필요가 없음. Authentication authentication = authenticationManager.authenticate(authenticationToken); System.out.println("authentication : authentication 생성 완료"); PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal(); System.out.println("Authentication : " + principalDetails.getUser().getUsername()); return authentication;SecurityConfig@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { private final CosConfig cosConfig; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); http.csrf(csrf -> csrf.disable()); http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http.addFilter(cosConfig.corsFilter()); // cors 허용 설정 http.addFilterBefore(new MyFilter3(), SecurityContextPersistenceFilter.class); http.formLogin(login -> login.disable()); http.httpBasic(basic -> basic.disable()); http.addFilter(new JwtAuthenticationFilter(authenticationManager)); http.authorizeHttpRequests(request -> request.requestMatchers("/api/v1/user/**") .hasAnyRole("USER", "MANAGER", "ADMIN") .requestMatchers("/api/v1/manager/**") .hasAnyRole("MANAGER", "ADMIN") .requestMatchers("/api/v1/admin/**") .hasRole("ADMIN") .anyRequest().permitAll() ); return http.getOrBuild(); } 와 같이 SecurityConfig를 업데이트된 Spring Security 독스를 보고 선생님께서 강의해주신 내용대로 만들어보았습니다.터미널에서는JwtAuthentication Filter : 로그인 시도중 JwtAuthenticationFilter : UserEntity(id=0, email=null, password=qwer1234, username=ssar, role=null, createDate=null) JwtAuthenticationToken : 토큰생성완료와 같이 JwtAuthenticationToken : 토큰생성완료 까지는 정상적으로 되는걸 확인하였습니다.이후 loadByUsername() 부분에 따로 출력을 찍어 확인한결과 호출이 안되는걸 확인했습니다.@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { UserEntity userEntity = this.userDao.findByUsername(username); System.out.println("================ loadUserByUsername ================"); System.out.println(userEntity); System.out.println("---------------- loadUserByUsername -----------------"); return new PrincipalDetails(userEntity); } 어떤 부분이 잘못되어서 그런건지 찾지 못하여 게시글 남깁니다! 늘 좋은강의 감사합니다! 개인적으로 문제점이 된다고 생각한 부분AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);에서 authenticationManager를 받는 부분이 제대로 안되는것 같습니다... 추가로 SecurityConfig 에서 authenticationManager 부분을 로그로 찍어본 결과 null 출력되는걸 확인했습니다... authenticationManager부분이 생성이 안되는걸까요?