안녕하세요 강의 수강중 질문이 몇가지 생겨서 질문드립니다 강의에서 제가 놓친걸수도 있는데 변수명앞에 m_의 의미는 뭔가요? 유니티에서 게임 실행시에 PlayerPrefs의 Sound값이 True임에도 불구하고 시작할 때 노래가 안나오는 현상이 계속 발생합니다..! 디버깅해보니 AudioManager의 Start가 TitleManager의 Start보다 빨리 시행돼서 LoadUserData를 하기 전에 AudioManager의 해당 코드에서 Mute()를 호출하는거 같습니다 (디버깅 해보면 이 시점엔 userSettingsData.Sound 값이 false 입니다) private void Start() { var userSettingsData = UserDataManager.Instance.GetUserData<UserSettingsData>(); if(userSettingsData != null) { if(!userSettingsData.Sound) { Mute(); } } } 전체 코드와도 비교해봤을 때 틀린 부분이 없었고 뭔가 될때도 있고 안될때도 있고 이러다보니 원인을 잘 모르겠습니다..!
강의에서 DDD의 개념을 적용하시면서 엔티티에 비즈니스 로직을 넣으셨었는데요. 아직까진 DDD에 대한 개념이 완벽히 정립되지 않아 별도의 자료로 공부를 하고 있습니다. 공부하는 차원에서 서비스 계층에서의 비즈니스 로직 개발로 코드 리팩토링을 스스로 해보고 강의에 나오지 않았던 상품 서비스 테스트 코드 작성 결과 일단 통과가 나오긴 했습니다만... 잘 한 것인지 몰라서 코드 평가를 좀 받아보고 싶어 질문을 올리게 되었습니다. 테스트 코드 역시 각 계층별로 지켜야 하는 테스트 코드 원칙이 있으나 이 부분도 같이 공부하느라 제대로 적용해보기 아직 어려운 단계라 @SpringBootTest 를 사용했습니다. 이 부분은 감안해주세요..! 또 다른 추가 질문이 있습니다. 강의에서 엔티티에 구현한 비즈니스 로직을 서비스 계층에 비즈니스 로직을 개발하는 방식으로 바꾸는 과정에서 엔티티를 직접 이용하는 것보다는 DTO를 만들어서 전달하는게 엔티티에 많은 변화를 가하지않는 유일한 방법일까요? ItemService 코드 package spring.project.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import spring.project.domain.Item; import spring.project.exception.NotEnoughStockException; import spring.project.repository.ItemRepository; import java.util.List; @Service @Transactional(readOnly = true) public class ItemService { private final ItemRepository itemRepository; @Autowired public ItemService(ItemRepository itemRepository) { this.itemRepository = itemRepository; } @Transactional public Long saveItem(Item item, int quantity) { addStock(item, quantity); itemRepository.save(item); return item.getId(); } private void addStock(Item item, int quantity) { item.setStockQuantity(item.getStockQuantity() + quantity); itemRepository.save(item); } @Transactional public void removeStock(Item item, int quantity) { int restStock = item.getStockQuantity() - quantity; if (restStock < 0) { throw new NotEnoughStockException("재고가 부족합니다."); } item.setStockQuantity(restStock); itemRepository.save(item); } public Item findOne(Long itemId) { return itemRepository.findOne(itemId); } public List<Item> findAll() { return itemRepository.findAll(); } } ItemServiceTest 코드 package spring.project.service; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import spring.project.domain.Album; import spring.project.domain.Book; import spring.project.domain.Item; import spring.project.repository.ItemRepository; @SpringBootTest class ItemServiceTest { @Autowired private ItemRepository itemRepository; @Autowired private ItemService itemService; @Test @DisplayName("상품 저장 시 상품 저장과 동시에 재고 수량이 증가해야 한다.") void save() { // given Book book = new Book(); book.setAuthor("홍길동"); // when Long id = itemService.saveItem(book, 3); // then Item item = itemRepository.findOne(id); Assertions.assertThat(item.getName()).isEqualTo(book.getName()); Assertions.assertThat(item.getStockQuantity()).isEqualTo(3); } @Test @DisplayName("상품 주문이 들어가면 재고 수량에서 주문 수량만큼 차감이 되어야 한다.") void remove() { // given Album album = new Album(); album.setName("영원"); Long id = itemService.saveItem(album, 100); // when itemService.removeStock(album, 4); // then Item item = itemRepository.findOne(id); Assertions.assertThat(item.getStockQuantity()).isEqualTo(96); } }
NextAuth에서의 session token을 통해 사용자정보랑 세션쿠키를 전달하고있는데요. 만일 access Token이랑 Refresh Token으로 관리를 한다고 한다면, Session Token도 반 강제적으로 사용해야 하는 것같은데 이럴때는 3개의 토큰을 만료일을 컨트롤 해야하는건가요..? 예로 access 30분 session 1시간 refresh 7일 이렇게 가져가서 엑세스와 세션 두가지의 토큰을 다 갱신해주어야 하는건지 아니면 제가 지금 이상한 프로세스를 생각중인지 모르겠네요 .. NextAuth에 리프래시 엑세스토큰을 통상적으로 어떻게쓰는지가 궁금합니다.. session token때문에 너무 혼동이오네요..
[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
강좌를 들은 후, 소셜로그인을 구현하다가 의문점이 생긴 부분이 있어 어떠한 방식으로 접근하는 것이 궁금하여 질문을 남깁니다. 상황 일반 회원가입시에는, 이메일 비밀번호 + 해당 서비스에 필요한 필수 정보들을 받고, 해당 내용을 클라이언트로 부터 받아 user테이블에 저장하는 상황입니다. 소셜 로그인 같은 경우에는, 정보를 받을 수 있는 것이 제한이 되어있어, 추가적으로 필요한 정보들을, 소셜 로그인 성공 이후, 클라이언트 측에서 회원가입시 필요한 정보들을 받을 수 있는 화면으로 이동시켜, 해당 정보를 받아서, 부족한 정보들을 채워넣는 것으로 알고 있습니다. 궁금점. 소셜로그인 로그인 후, 신규 유저이기에 서비스 이용에 필요한 필수 부가정보 입력을 받기위해, 회원가입 창으로 이동시켜, 부가 정보를 입력받는다면 크게 문제가 없습니다.하지만, 앱을 사용하다보면은 데이터가 끊긴다거나, 배터리가 방전된다거나, 알수없는 이유로, 로그인은 되었으나, 필수 부가정보를 입력하지 못하고, 꺼지는 경우가 있습니다. 필수 부가정보를 꼭 받아야 하는 경우라면 이 부분에 대해서 어떻게 처리해야하나요?필수 정보를 채웠는지 여부를 확인하는 column을 boolean으로 User 테이블에 추가하여, 클라이언트에서 해당 Column으로 부가정보를 입력받지 않았으면 메인화면으로 가지않고, 회원가입 스크린으로 리다이렉 시키는 이런 로직을 작성해야하나요?필수 정보를 채웠는지 여부를 확인하는 column 없이 이런 경우에 처리할 수 있는 방안이 있는지 궁금하고, 현업에서는 어떤식으로 테이블을 설계하는지 궁금합니다!
소셜로그인을 구현하다가 의문점이 생긴 부분이 있어 어떠한 방식으로 접근하는 것이 궁금하여 질문을 남깁니다. 상황 일반 회원가입시에는, 이메일 비밀번호 + 해당 서비스에 필요한 필수 정보들을 받고, 해당 내용을 클라이언트로 부터 받아 user테이블에 저장하는 상황입니다. 소셜 로그인 같은 경우에는, 정보를 받을 수 있는 것이 제한이 되어있어, 추가적으로 필요한 정보들을, 소셜 로그인 성공 이후, 클라이언트 측에서 회원가입시 필요한 정보들을 받을 수 있는 화면으로 이동시켜, 해당 정보를 받아서, 부족한 정보들을 채워넣는 것으로 알고 있습니다. 궁금점. 소셜로그인 로그인 후, 신규 유저이기에 서비스 이용에 필요한 필수 부가정보 입력을 받기위해, 회원가입 창으로 이동시켜, 부가 정보를 입력받는다면 크게 문제가 없습니다.하지만, 앱을 사용하다보면은 데이터가 끊긴다거나, 배터리가 방전된다거나, 알수없는 이유로, 로그인은 되었으나, 필수 부가정보를 입력하지 못하고, 꺼지는 경우가 있습니다. 필수 부가정보를 꼭 받아야 하는 경우라면 이 부분에 대해서 어떻게 처리해야하나요?필수 정보를 채웠는지 여부를 확인하는 column을 boolean으로 User 테이블에 추가하여, 클라이언트에서 해당 Column으로 부가정보를 입력받지 않았으면 메인화면으로 가지않고, 회원가입 스크린으로 리다이렉 시키는 이런 로직을 작성해야하나요?필수 정보를 채웠는지 여부를 확인하는 column 없이 이런 경우에 처리할 수 있는 방안이 있는지 궁금하고, 현업에서는 어떤식으로 테이블을 설계하는지 궁금합니다!
파일 'c:\Program Files\Test.Pyton\ test.py '(NoPermissions (FileSystemError): Error: EPERM: operation not permitted, open 'c:\Program Files\Test.Pyton\ test.py ')을(를) 쓸 수 없음 이렇게 나오는데 재부팅 해도 똑같네요
윈도우 사용자입니다. kafka-connect 설치 부분이 너무너무 어려워요 ㅠㅠ 목표는 kafka,zookeeper -> Docker 컨테이너로 관리 Kafka-Connect, JDBC connector 어떻게든 되기만 해보기, MySQL-jdbc connector 사용하기 입니다. 실제 사용할 때는 docker 를 이용하여 zookeeper 와 kafka 를 사용할 계획이라서 docker 를 사용 , zookeeper 와 kafka를 컨테이너로 관리할 계획입니다. 하지만 kafka-connect 부분 부터 JDBC 관련 부분까지 4~5일 동안 고생하고 있습니다. 시도했던 방법 1. -> 강의 내용 대로 해보기 저는 curl 명령어가 안되어서 curl.exe 로 진행해봤습니다. 강의에서 처럼 tar 명령어로 압축해제 할 떄 해제 중 아래와 같은 에러가 항상 발생하였습니다. 그래서 그냥 윈도우 마우스 우클릭으로 해제하면 가 발생하고 이 에러는 찾아도 안 나오더라고요 그냥 무시하고 진행하면 (건너 뛰기 ) 누르면 이런 에러가 발생하고 https://www.inflearn.com/questions/229060/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-connector-%EC%8B%A4%ED%96%89%EC%8B%9C-%EC%98%A4%EB%A5%98%EA%B0%80-%EC%83%9D%EA%B2%A8-%EC%A7%88%EB%AC%B8-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4 이 게시글의 답변을 참고하여도 여전히 변함없는 것을 확인한 이후에 도저히 설치는 못하겠다. 라고 생각해서 컨테이너로 올릴 수 있는 방법을 찾아보았습니다. 시도했던 방법 2-> https://velog.io/@ililil9482/kafka-db-%EC%97%B0%EB%8F%99-feat.-mysql 이 방식이 제가 생각한 워너비라서 그대로 따라 해도 오류가 발생합니다. Volume 설정이 제대로 안되는지 블로그 그대로 관리하고 해도 실제 jar 파일이 들어가지 않더라고요! 이외에도 정말 많은 방법을 시도했는데 번번히 실패하거나 저랑 실행 환경이 달라서 포기하였습니다. 검색도 많이하고 많이 읽어봤습니다. 이제는 진짜 죄송한데 혼자 해낼 자신이 없어요ㅠㅠ 윈도우 환경에서 kafka , zookeeper 컨테이너 관리 My-Sql jdbc connector 사용하기 Kafka-Connect, JDBC connector 어떻게든 되기만 해보기 이게 진짜 너무너무 하고 싶은데 방법이 없을까요?
슬라이드가 아스키코드라고 되어있어서 긴가민가하다가 질문남깁니다!*p=null p=a ; 여기부분이 포인터 변수 p가 null값이고p는 a값이라 서로 다른 변수라 봐야하나요? 저는 printf("%s\n" p) 이 부분을 보고나서p는 포인터변수로 선언하고 a를 넣어줬는데 그럼 배열 a의 맨 처음 인덱스가 들어와서 A만 출력되는 거 아닌가? 어 근데 %s면 문자열인데..하다가 슬라이드명이 ascii코드라서 거기에 사로잡혀서 A는 65니까 문자열로 못쓸거라 판단하고 여기서부턴 포인터 p랑 p랑 아예 달라서 그냥 Art를 문자열로 전부 출력하라는 말이구나 하고 다시 풀긴했거든요. 근데 답은 맞았어도 과정이 이게 맞나 싶어서요.기출에 포인터랑 아스키코드랑 막 섞어서 출제됐던 적이 있었던 기억이 나서 문제풀 때 이런 부분들이 자꾸 헷갈리네요 ㅠ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] [조회한 빈 모두 필요할 때 , List, Map] 강의를 보고 스프링 빈에 등록되는 것을 모든 빈이 궁금하여 조회해 보았습니다. 그런데 @Autowire를 통해 Map policyMap, List policies은 빈 에는 등록 되지 않아 보입니다. 그 이유가 AutoConfig.class를 통하여 @Componet가 설정된 클래스와 명시적으로 설정한DiscountService.class가 빈으로 등록 되고 Map policyMap, List policies은 @Componet설정이 된것이 아닌 스프링이 제공하는 기능으로 의존 관계 설정만 되는 것이 맞나요? 코드 package hello.core.autowired; import hello.core.AutoAppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; public class AllBeanTest { @Test void test(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames){ BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){ System.out.println("beanDefinitionName = " + beanDefinitionName + " / beanDefinition = " + beanDefinition.getBeanClassName()); } } } static class DiscountService { // 해당 타입(DiscountPolicy)에 일치하는 모든 빈이 컬렉션에 자동 추가 된다. -> 스프링이 제공하는 기능 // List에는 해당 타입의 빈이 순서대로 들어 간다. // Map에는 빈 이름을 키로, 빈 객체 값을 가지게 된다. private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(List<DiscountPolicy> policies, Map<String, DiscountPolicy> policyMap) { this.policies = policies; this.policyMap = policyMap; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } } }
스프링부트에서 flyway 데이터베이스 마이그레이션 강의를 보고 있습니다. 옛날 강의라서 강사님은 2.4.5 버전과 flyway 7.x버전을 사용하셨습니다. 일단은 저도 flyway 10.x버전을 사용하려다가 db에 연결이 안되서 7.x버전을 사용하니 성공하여 진도를 나갔습니다. 하지만 test코드 만드는 과정에서 호환문제로 결국 또 막혀서 9.8.1버전을 사용하여 다시하고 있습니다. build.gradle입니다. plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' id 'org.flywaydb.flyway' version '9.8.1' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.flywaydb:flyway-core:9.8.1' //runtimeOnly 'com.h2database:h2' implementation 'mysql:mysql-connector-java:8.0.32' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } flyway { url = 'jdbc:mysql://localhost:3306/db_example' user = 'sa' password = 'password' locations = ['classpath:db/migration'] baselineOnMigrate = true } properties입니다. spring.application.name=bookstore spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example spring.datasource.username=sa spring.datasource.password=password spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true spring.flyway.locations=classpath:db/migration main->resources->db->migration디렉토리에 V1__create_books.sql 파일을 만들었습니다. CREATE TABLE books( id BIGINT NOT NULL, name VARCHAR(64), author VARCHAR(64) ); db도 문제 없습니다. 7.x버전으로 했을 때 인텔리제이 터미널에서 ./gradlew flywayMigration 해서 테이블을 만드는 것까지 성공했습니다... 스프링부트3.3.2에 맞는 flyway버전을 사용했더니 계속 실패합니다. 분명 url경로도 맞게 했고 틀린부분이 없을텐데 왜 이럴까요. 디펜던시도 implementation 'org.flywaydb:flyway-core:9.8.1' implementation 'org.flywaydb:flyway-mysql:9.8.1' 이렇게 바꿔보고 여러짓을 해봤지만 ./gradlew flywayMigration 성공못하고 있습니다.. flyway 9.버전일 때 ./gradlew flywayClean성공하고 ./gradlew flywayMigration실패했는데, db_example을 지우고 다시 생성해서 해보니 ./gradlew flywayClean도 이제 실패합니다. PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew flywayClean > Task :flywayClean FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flywayClean'. > Error occurred while executing flywayClean No database found to handle jdbc:mysql://localhost:3306/db_example * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 1s 1 actionable task: 1 executed PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew flywayMigrate > Task :flywayMigrate FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flywayMigrate'. > Error occurred while executing flywayMigrate No database found to handle jdbc:mysql://localhost:3306/db_example * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 1s 1 actionable task: 1 executed PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\제로베이스\springlecture\bookstore> 이것들은 성공하네요.. PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew clean BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew build BUILD SUCCESSFUL in 3s 7 actionable tasks: 7 executed
class Parent{ } class Child extends Parent{ } void main ① Parent.a = Child() ② Child.b = Child() 위 식에서 ① ② 두 문장의 차이가 궁금합니다. 둘다 = Child()기 때문에 본인들이 태어날때 부모 기본자도 실행할 것이고, 만약 a나 b에 없는 메소드를 실행시킨다면 부모 클래스를 찾아가는 것도 같은데 둘에 무슨 차이가 있는지 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 2분 22초 에 선생님이 하신 말씀이 예를들어 X002.method 가 호출되면 힙영역의 인스턴스에서 메서드영역에있는 메서드를 호출하고 스택영역에 메서드 호출정보들이 저장된다 라고 이해해도 되나요?