[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 아니오 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오 [질문 내용] implementation, compileOnly, runtimeOnly 등 각각이 어떻게 작동하는지와 어떤 경우에 어떤 라이브러리를 어떤 방식으로 등록하는지에 대한 설명이 없는것 같아서 조금 아쉬운 마음입니다. 혹시 새로운 강의에서는 좀 더 디테일한 설명이 있었으면 좋겠다는 의견 드립니다. 감사합니다.
mac os m1 사용중인데, configuration 서버의 bootstarp에 적은 key file 경로에 한글이 들어가면 경로 인식이 제대로 안되는것 같습니다. 물론 한글이 안들어가는 경로상에 key 파일을 위치시켜도 되지만, 프로젝트 자체를 한군데에서 관리해야 나중에 다시 공부할때 헷갈리지 않을 것 같아서 한글경로가 들어간 위치에 key를 두고 싶은데, 혹시 한글이 들어가도 location 설정을 문제없이 하는 방법은 없을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 컨트롤러를 두는 패키지명을 controller가 아닌 web으로 하신 이유가 궁금합니다
안녕하세요. 해당 강의를 수강하다 궁금증이 생겨 질문 드립니다. 강의에서는 MemberService 같은 경우에 @Transactional public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } 이런식으로 엔터티를 파라미터로 받고, MemberApiController 같은 경우에는 @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } 별도의 DTO를 파라미터로 받아 member 엔티티 객체를 생성하여 set 해주는 식으로 진행하였는데, (set 말고 생성메소드를 이용해야하는건 알아요!) 1. 엔티티를 외부에 노출하면 안되고, API 스펙이 바뀌어도 문제가 생기지 않기 위해 Controller단에 파라미터 및 반환값에 DTO를 사용하는 것은 당연하다. 그렇다면 서비스나 리포지토리에서는 파라미터로 엔티티를 받아야 하나요? DTO를 받아야 하나요?? 2. 만약 DTO를 Controller에서만 받고, Service단에서 파라미터로 엔티티를 받는다면, Controller 단에서 엔티티 객체를 생성하여 Dto의 정보를 넣어준 뒤 Service단으로 보내줘야하는데, Controller단에서 엔티티를 생성하는 것이 괜찮은 방법인가요? 어떤게 더 좋은 방법이고, 실무에서 더 많이 쓰는 방법인지, 어떤 장단이 있는지도 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] \querydsl\src\test\java\study\querydsl\repository\MemberJpaRepositoryTest.java:21: error: cannot find symbol MemberJpaRepository memberJpaRepository; ^ symbol: class MemberJpaRepository location: class MemberJpaRepositoryTest MemberJpaRepository 테스트 오류를 어떻게 확인해야되나요 동일하게 질문하신 분이 계신데 드라이브 통해서 파일 올리라고만 답변되어있어서 질문 드립니다. 강의와 같은 경로에 repository 생성 후 테스트를 돌리면 심볼 오류가 납니다. 확인 부탁드립니다!! generated/study/querydsl/repository/ MemberJpaRepository 소스 코드 경로 https://drive.google.com/file/d/1wV-xy9-oUE0TgfONiumr5dr2TniGHdj_/view?usp=sharing
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 강사님처럼 코드를 다음과 같이 작성했습니다. MemberApiController.java package jpabook.jpashop.api; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jpabook.jpashop.domain.Member; import jpabook.jpashop.service.MemberService; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @GetMapping("/api/v1/members") public List<Member> membersV1() { return memberService.findMembers(); } @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long joinedMemberId = memberService.join(member); return new CreateMemberResponse(joinedMemberId); } @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } @Data static class CreateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class CreateMemberResponse { private final Long id; } @Data static class UpdateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class UpdateMemberResponse { private Long id; private String name; } } MemberService.java package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; /* * 회원 가입 * */ @Transactional public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } /* * 중복 확인 메서드 * */ private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } // 회원 전체 조회 public List<Member> findMembers() { return memberRepository.findAll(); } public Member findOne(Long memberId) { return memberRepository.findOne(memberId); } @Transactional public void update(Long id, String name) { Member member = memberRepository.findOne(id); member.setName(name); // 영속성 컨텍스트에서 엔티티를 수정하면 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)가 동작한다. } } MemberRepository.java package jpabook.jpashop.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; // 컴포넌트 스캔에 의해 // 스프링 빈에 자동으로 등록 @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public List<Member> findByName(String name) { return em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); } } Member.java package jpabook.jpashop.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } 그리고 postman으로 localhost:8080/api/v1/members로 호출을 하게 되면 다음과 같이 무지막지하게 많은 양의 결과가 나옵니다. 왜 그러는 걸까요?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] build.gradle에서 에러가 발생합니다 자바 버전 17 사용했습니다 Could not apply requested plugin [id: 'io.spring.dependency-management', version: '1.1.5'] as it does not provide a plugin with id 'io.spring.dependency-management'. This is caused by an incorrect plugin implementation. Please contact the plugin author(s).> Plugin with id 'io.spring.dependency-management' not found.
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:143) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] 이런식의 오류가 났는데 데베설정이 잘못돼서 그런건가요 코듣상의 문제는 없는거 같습니다.
npx create-react-app mall 명령어 입력시 해당 오류가 발생합니다. log의 내용은 다음과 같습니다. 0 verbose cli C:\Program Files\nodejs\node.exe C:\Users\USER\AppData\Roaming\nvm\v10.16.3\node_modules\npm\bin\npm-cli.js 1 info using npm@10.7.0 2 info using node@v20.15.0 3 silly config:load:file:C:\Users\USER\AppData\Roaming\nvm\v10.16.3\node_modules\npm\npmrc 4 silly config:load:file:C:\Users\USER\reactAPI_workSpace\.npmrc 5 silly config:load:file:C:\Users\USER\.npmrc 6 silly config:load:file:C:\Users\USER\AppData\Roaming\npm\etc\npmrc 7 verbose title npm exec create-react-app mall 8 verbose argv "exec" "--" "create-react-app" "mall" 9 verbose logfile logs-max:10 dir:C:\Users\USER\AppData\Local\npm-cache\_logs\2024-07-01T07_49_17_781Z- 10 verbose logfile C:\Users\USER\AppData\Local\npm-cache\_logs\2024-07-01T07_49_17_781Z-debug-0.log 11 verbose stack TypeError: LRUCache is not a constructor 11 verbose stack at Object.<anonymous> (C:\Users\USER\AppData\Roaming\nvm\v10.16.3\node_modules\npm\node_modules\cacache\lib\memoization.js:5:18) 11 verbose stack at Module._compile (node:internal/modules/cjs/loader:1358:14) 11 verbose stack at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) 11 verbose stack at Module.load (node:internal/modules/cjs/loader:1208:32) 11 verbose stack at Module._load (node:internal/modules/cjs/loader:1024:12) 11 verbose stack at Module.require (node:internal/modules/cjs/loader:1233:19) 11 verbose stack at require (node:internal/modules/helpers:179:18) 11 verbose stack at Object.<anonymous> (C:\Users\USER\AppData\Roaming\nvm\v10.16.3\node_modules\npm\node_modules\cacache\lib\get.js:8:14) 11 verbose stack at Module._compile (node:internal/modules/cjs/loader:1358:14) 11 verbose stack at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) 12 verbose cwd C:\Users\USER\reactAPI_workSpace 13 verbose Windows_NT 10.0.19045 14 verbose node v20.15.0 15 verbose npm v10.7.0 16 error LRUCache is not a constructor 17 verbose exit 1 18 verbose code 1 19 error A complete log of this run can be found in: C:\Users\USER\AppData\Local\npm-cache\_logs\2024-07-01T07_49_17_781Z-debug-0.log node 와 npm 버전은 이렇게 깔려있습니다. 재설치 해도 여전히 오류가 발생합니다 ㅜㅠ 어떻게 해결해야 할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의대로 application.yml로 했을 때는 생성이 잘 되었습니다. 그런데 test -resource - application-test.yml로 넘어가니 h2에 Member테이블이 생성되지 않습니다. 어떻게 해야할까요?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. ApiResponse클래스에 HttpStatus와 code를 같이 보내게 되는데 사실 ResponseEntity . ok () .body(ApiResponse~~~) 이런 식으로 보내게 된다면 httpstatus가 HTTP 메시지의 바디에도 있고 헤더에도 있게 되는데 굳이 바디에 한 번 더 보내시는 이유가 있으신가요?? 실무에서는 어떻게 하시는 지 궁금합니다.
강의의 기본 설정 그대로 아무 메이븐 추가 없이 강의에서 추가하는 메이븐 그대로 추가를 했는데도 계속된 오류가 발생하는데, 혹시 현제 버전에서 어떻게 하면 이 문제를 해결할 수 있는지 가르쳐 줄 수 있을까요? eureka: instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} client: service-url: defaultZone: http://127.0.0.1:8761/eureka/ fetch-registry: true register-with-eureka: true <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cloud</groupId> <artifactId>user-service-test</artifactId> <version>0.0.1-SNAPSHOT</version> <name>user-service-test</name> <description>user-service-test</description> ,, <properties> <java.version>17</java.version> <spring-cloud.version>2023.0.2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project> @SpringBootApplication @EnableEurekaServer public class UserServiceTestApplication { public static void main(String[] args) { SpringApplication.run(UserServiceTestApplication.class, args); } } 기본 설정 그대로 실행하면 밑에 와 같은 오류가 지속적으로 발생 합니다.
입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
안녕하세요. 강의 내용중에 궁금한게 있어서 질문 드립니다. 로그인 폼을 거치지 않고 POST body를 전달해서 바로 로그인 해보면 어떨까 해서 시도 했는데 잘 되지 않네요 ... fun filterChain(httpSecurity: HttpSecurity): SecurityFilterChain { return httpSecurity .authorizeHttpRequests { authorizeHttpRequests -> authorizeHttpRequests .requestMatchers(AntPathRequestMatcher("/admin/**")).authenticated() .anyRequest().permitAll() }.csrf {csrf -> csrf.disable() }.headers { headers -> headers.addHeaderWriter(XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN)) }.formLogin { formLogin -> formLogin.defaultSuccessUrl("/h2-console") // 추가 ////////////////////////////////////////// formLogin.loginProcessingUrl("/login") formLogin.usernameParameter("email") formLogin.passwordParameter("password") }.logout { logout-> logout.logoutRequestMatcher(AntPathRequestMatcher("/admin/logout")) .logoutSuccessUrl("/") }.build() } 강의 내용중에 제가 주석으로 추가 내용 달았어요... 그리고 Entity는 아래처럼 구성했습니다. class Account(email: String, pw: String): BaseEntity(), UserDetails { ........ @field:NotNull @Column(unique = true) var email: String = email @Column(name = "password") var pw: String = pw 그래서 위에처럼 전달했습니다. 그리고 run accountRepository에 디버깅 브레이크를 걸고 Post 메세지를 쐈습니다. 그런데 디버깅 걸린건 "" 공백이네요. 프론트 엔드에서 시큐리티 로그인페이지를 만들고 아디이 패스워드를 전달해서 제어하려고 시도 했는데 뭔가 문제가 있나봐요... 답변 해주지면 감사하겠습니다. @Service class AdminSecurityService( private val accoutRepository: AccountRepository ) : UserDetailsService { override fun loadUserByUsername(email: String): UserDetails { return accoutRepository.findByEmail(email) .orElseThrow{RuntimeException("사용자 정보를 찾을 수없습니다.") } } } ========= 추가 질문 드려요 지금 시큐리티 로그인은 Spring boot 초기화 스타트 한후 유저의 접근을 막는 방화벽 같은 용도로 사용하는건가요?? 아니면 웹 "react" http://localhost:3000/ 에서 로그인 폼 게발한후에 로그인 정보(이메일, 패스워드 아이디)를 http://localhost:8080/login 에 POST / GET 방식으로 전달하고 시큐리티에 접근해서 로그인 하는 사용자 로그인 목적으로 사용하는건지 ... 이게 intellij IDEA에 웹페이지랑 스프링 부트를 개발해서 강의내용은 이해하는데 프론트 엔드와 백엔드와의 통신으로 본다면 좀 헛깔려요 로그인 페이지는 프론트 엔드에서 만드는게 아니라 백엔드에서 만들어야하나... 그럼 프론트엔드에서 백엔드에 접근해 시큐리티 로그인을 한후 로그인 성공 했다는 메세지를 어떻게 프론트 엔드에 전달해야되는지... 그냥 관리자 페이지(사용자 목록 리스트나 사용자 로그인 접근 정보를 보는 용도)를 사용할때 시큐리티 로그인을 사용하고 user로그인(작성한 글, 좋아요 같은 카운트, 로그인한 전화번호, 사진 정보)은 따로 user 로그인하는 Api Controller에 접근해서 로그인 하는건지 좀 헛깔려요. 현재 구글에서 찾아보면 관리페이지는 시큐리티로 접근 사용자, 게스트튼 로그인 API로 접근해서 관리하는거 같은데 정보 찾는게 어렵네요...