묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 시큐리티
RoleHierarchy 엔티티를 따로 만들지 않아도 되나요?
RolehierarchyImpl 에 String 타입 프로퍼티에 A > B\n 이런 타입으로 지정만 해주면 될 것 같아서 Role 엔티티 자체에 RoleGrade 라는 ENUM 타입을 지정해줘서 알파벳 순으로 가져와서 그걸 for-loop 돌리면서 문자열만 만들면 될거 같아서 해봤는데 실시간으로 적용이 되더라구요. @Overridepublic void reloadRoleHierarchy() { StringBuilder sb = new StringBuilder(); List<Role> allRoles = roleRepository.findAllWithRoleGrade(); for (int i = 0; i < allRoles.size(); i++) { try { allRoles.get(i + 1); /* 검증 코드 */ sb.append(allRoles.get(i).getRoleName()); sb.append(" > "); sb.append(allRoles.get(i + 1).getRoleName()); sb.append("\n"); } catch (Exception e) { break; } } this.roleHierarchy.setHierarchy(sb.toString());} ResourcesController 에서 자원 등록, 삭제 하고나서 reload 메소드를 호출했듯이 이 메소드를 Role 등록, 삭제 뒤에 등록해주니 잘 되네요. 혹시 실무에서는 이런식으로 쓰는것보다 엔티티를 따로 만들어서 관리하는것을 선호하나요? RoleHierarchy 엔티티 안에 자기 자신을 ManyToOne 으로 조인하니 너무 어려워서 이렇게 해보긴 했는데, 실무에서는 엔티티 방식으로 관리하는걸 선호하는지 궁금해서 질문드립니다. 혹시 몰라 git 링크 첨부해봅니다. 한번 봐주시면 감사하겠습니다. review4 브랜치입니다. https://github.com/twosom/SpringSecurity-ProjectReview.git *추가적으로 이제 계층 구조 Role을 구성했으면 Resources 랑 Role 은 굳이 N : N 관계로 구성하지 않아도(테이블 상에서는 1 : N , N : 1) 되는건가요? 기존에는 하나의 Reosurces 에 여러개의 Role 이 있을 수 있고 Role 하나가 여러 Resources 에 포함될 수 있기에 N : N 관계로 만들었지만, 계층 구조가 적용되면 외래키가 Resources 테이블에만 존재해도 (N : 1) 될 것 같아서요. 항상 좋은 강의 감사드립니다.
-
미해결실전! 스프링 데이터 JPA
DTO조회와 PROJECTION의 차이가 궁금합니다 !
안녕하세요 강사님! 활용편 1,2편에 이어서 이번 실전편도 듣고 있습니다. 활용편 2편에서 DTO로 조회하시는 걸 알려주셨는데요. 언듯 보기에는 DTO로 조회하는 것과 프로젝션으로 조회하는것이 비슷해 보이는데, 제가 지금 이해하기로는 - DTO의 경우 엔티티의 모든 필드를 조회해서 DTO에 넣어준다음에 반환 -프로젝션의 경우 프로젝션에 선언한 필드만 조회해서 반환 하는 차이만 있는 걸까요? 아니면 제가 잘못알고있거나 이해하지 못한 부분이 있는지 궁금합니다 ! 만약 단순하게 하나의 엔티티를 조회한다 할 경우, DTO와 프로젝션 어느 쪽을 더 선호하시는 지 궁금합니다 ! 감사합니다 !
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA DTO 직접조회 질문 드립니다.
안녕하세요 강사님. 강의 복습 중에 질문이 생겨서 문의 드립니다 JPA 에서 DTO 직접조회를 하는데 (일대다 조회) 일반적으로 엔티티를 DTO 로 변환해서 조회하는 방법보다 더 불편하고 유지보수할때 복잡해 보이는데, 실제 운영에서도 DTO를 직접조회해서 사용을 많이 할까요 ??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew.bat 저 처럼 헤메시는분들이 없기를 바라며
저는 cmd를 사용하지 않고 구글에서 cmmder을 설치하여 사용합니다. 제일 먼저 spring 디렉토리로 이동합니다. cd 디렉토리 그 후 ls -al을 입력해 보면 gradlew.bat 이라는 이름의 bat파일이 보이실 거에요. 복사하여 gradlew.bat build를 해줍니다. 위와 같이 Build Successful이라 뜨면 성공한거구요. ls -al을 해보면 build 폴더가 보이실 거고 cd build를 해주신 다음에 cd libs 해주고 해당 디렉토리에서 java -jar hello-spring-0.0.1-SNAPSHOT.jar 이렇게 해주니 성공적으로 실행이 돼네요. 어찌보면 영상에 나와있는 내용 그대로 글로 적은것 뿐이지만 누군가에게 도움이 돼셨길 바라며
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA가 Mybatis를 완벽히 대체 가능한가요?
주니어 개발자로 현재 SI업체에서 근무하고 있는데, 개발시 Mybatis를 사용합니다. 강의를 듣고 간단하게 JPA를 적용해서 샘플 프로젝트정도를 만들어 보았는데 개인적으로는 매우 마음에 들어서 프로젝트에도 한번 써보고 싶어서 사수에게 건의 하였으나 JPA는 간단한 CRUD에는 좋은데 실제 프로젝트에서는 통계등을 조회해야하는데 매우 많은 조인들이 들어가고 sql 쿼리만 수백줄이 되는데, 이런걸 JPA가 대체하기 어렵다. 라는 답변을 받아서 문의 드립니다. 근데 생각해보면 좀 이상한게 해외에서는 JPA가 더 많이 사용된다는데 해외에는 차트같은게 없나..? 싶은 생각이 들더라구요. 그래서 JPA가 mybatis를 완벽히 대체가 가능한건지, 아니면 둘을 병행해서 써야 하는건지 궁금합니다.
-
미해결스프링 시큐리티
그럼 SecurityContext가 저장되는 곳은 총 3곳인건가요?
처음에 Authentication객체를 SecurityContext에 담아서 보관한다는것 까지능 이해했습니다. 그럼 SecurityContext가 저장되는 곳이 1. ThreadLocal 2. HttpSession 3. SecurityContextHolder 총 3개의 공간에 저장되는 건가요? 그리고 이 공간은 각각 독립된 공간인건가요? 아니면 ThreadLocal안에 SecurityContextHolder가 포함되고 HttpSession은 따로 저장되는 구조인건가요? 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository 와 ItemRepository에서의 em 차이점
김영한 강사님 안녕하세요. 좋은 강의 항상 잘 보고있습니다! ㅎㅎ 다름이 아니라 강의를 쭉 듣던 중 궁금증이 생겼습니다. MemberRepository에서 em은 @PersistenceContext를 붙였는데 ItemRepository에서는 @PersistenceContext를 붙이지 않고 그냥 final 처리만 되어있습니다. 제가 보기엔 둘다 같은 역할을 하는 em인것 같은데 소스코드에서는 왜 다르게 구현하신건지 궁금합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Eureka 실행하게 되면 상태값이 왜 저는 데스크탑이라고 나오나요?
첫번째가 정상인데 두번째 사진이 제가 한겁니다.. 왜 이렇게 나오는건가요? 그리고 게이트 웨이 서버에서 설정파일에 가시면 routes: - id: first-service# uri: http://localhost:8081/ uri: lb://MY-FIRST-SERVICE 이렇게 설정시 에러가 발생되면서 첫번째 서버쪽으로 안가지네요... java.net.UnknownHostException: failed to resolve 'DESKTOP-KD56ARJ' after 4 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.63.Final.jar:4.1.63.Final] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] |_ checkpoint ⇢ HTTP GET "/first-service/welcome" [ExceptionHandlingWebHandler] Stack trace: ㅇ무엇이 문제일까요? ㅠ,ㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
한 애플리케이션에서 OSIV를 어떻게 나누어 관리하나요?!?!
마지막 참고에서는 트래픽이 많은 API는 OSIV를 끄고, 많은 트래픽이 없어 커넥션을 유지해도 되는 상태인 ADMIN같은 경우는 OSIV를 켜두는 것이 좋다고 하셨습니다!!! 여기서 궁금한 점이 spring.jpa.open-in-view는 글로벌 설정인데 한 애플리케이션에서는 화면 의존적인 서비스가 있을 수도 있고 아닐 수도 있다고 생각합니다. (여러 서비스가 있을 수도 있다고 생각합니다.) 그렇다면 개별적으로 osiv를 설정하는 방법이 있는건가요? (항상 좋은 강의 감사합니다.)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 서비스 테스트코드
안녕하세요 선생님! 혼자 복습하다가 문득 호기심이 생겨, 상품 서비스의 테스트를 진행해보다 . @SpringBootTestclass ItemServiceTest { @Autowired private ItemService itemService; @Test void 상품_등록() { Book book = new Book(); book.setName("jpa"); book.setPrice(10000); Long itemId = itemService.saveItem(book); Assertions.assertThat(book).isEqualTo(itemService.findOne(itemId)); }} 이렇게 되면 테스트가 실패하는데 그 이유가 객체 타입이 달라서 그런건가요? 테스트 코드의 객체는 Book이고 service 계층에서의 반환형은 Item이라 생각하여 Repository 계층과 Service 계층의 반환형을 모두 Book으로 해도 테스트가 실패합니다. 혹시 이유를 알 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
TDD 관련 질문
안녕하세요 영한님 드디어 야생형 코스가 끝났습니다! 스프링 MVC도 이제 곧 구매 대기 중입니다ㅎㅎ 다름이 아니라 TDD 관련 질문입니다. 질문을 어디다 해야될지 모르겠어서 여기 다 질문합니다.. 1. 보통 Spring에서 각 계층별로 TDD를 진행하나요? 예를 들어, entity -> repository -> service -> controller 순으로 수업을 진행하셨는데 실무에서는 entity 개발 후에 entity 로직에 대한 tdd, respository tdd, service tdd, controller tdd 이런 식으로 다하나요? 2. 각 계층별로 단위 테스트와 통합 테스트를 전부 다 하는 건가요? 현재 프로젝트를 진행하는 데 계층별로 단위 테스트와 통합 테스트를 다 해야되는 건지 궁금했는데 구글링해도 자료가 잘 없네요ㅠㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
질문
안녕하세요! 간단한 질문이 있습니다. 7:48 초에 defaultZone에서 서비스를 등록할 서버의 주소로 8761 포트에 등록한다는 것까지는 이해가 되었는데 뒤에 /eureka를 붙여주는 이유는 뭔가요?
-
미해결실전! 스프링 데이터 JPA
벌크성 수정 쿼리 질문
안녕하세요 영한님 벌크성 수정 쿼리 강의해주실 때 em.flush() em.clear() 를해야한다(영속성 컨텍스트에 있는 캐시정보들을 DB에 반영하기 위해)고 말씀해주셨는데 만약 어떤 user들의 age가 20이 넘는 사람의 인원수가 5명이라고 가정하고 이들의 나이를 1씩 올렸다고 가정했을때 캐시에는 반영이 안되고 바로 DB에만 반영이 되는데 이때 제가 궁금했던것은 em.flush를 하면 1치캐시에 있는것을 db에 반영시키는것(더티체킹을 포함하여) 이라고 생각해서 이 경우에는 1차캐시가 반영되면 안되는것 아닌가요? 캐시 DB -> 벌크성수정쿼리-> 캐시 DB -> em.flush() -> 캐시 DB 40 40 40 41 40 40
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join fetch 와 그냥 join 이 동일한 결과를 가지고 오나요?
안녕하세요. 강의 재밌게 잘 보고 있습니다. jpql 예제에서 V3 에는 join fetch 를 사용하고, V4 에서는 join 만 사용하셨는데 동일한 inner join 쿼리가 생성된 것 같습니다. 두 개의 사용 유형이 같은 방식으로 동작하는 것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO를 만드는 레이어에 관한 질문
안녕하세요! - 서비스에서 DTO를 만들어서 컨트롤러에게 리턴하는 방식 - 서비스에서는 엔티티를 리턴하고 컨트롤러에서 최종적으로 응답을 내보낼 때 DTO로 감싸서 내보내는 방식 두가지의 방법중에서 어떠한것이 더 좋은 선택일까 고민하고 있습니다. 인터넷을 찾아봐도 많은 논쟁들이 있었지만 무엇이 더 나은 방법이라고 확실하게 답변해주는 건 없는 것 같아요. 개인적으로 서비스에서 DTO를 반환하는게 핵심 비즈니스 로직을 감출 수 있고 의존성을 낮출 수 있다고 생각합니다. 그런데 여기서 문제점이 생기는데, 예를 들어 UserService에 아래와 같은 메소드 2개가 있다고 가정할게요. - findByUserId(Long id) - 내부에서 repo호출하여 유저 엔티티를 가져온 후 DTO로 반환 - updateUser(Long id, ...) `updateUser()`에서는 `findByUserId()`를 호출하여 유저를 가져오고 특정 로직에 따라 업데이트하는 구문을 수행하는 목적입니다. 그런데 `findByUserId()`에서 엔티티를 반환했기때문에 엔티티를 가져오기 위해 다시 한번 repo를 호출하여 실제 엔티티를 가져온 후 정보를 변경하는 로직을 수행해야합니다. 따라서 추가적인 쿼리가 발생하는 문제가 생깁니다. 사실 위 예제는 조금 극단적인 예제이긴 합니다만, 실무에서 개발하다보니 서비스에서 서비스를 호출하는 경우가 빈번하게 발생하더라구요. 하지만 엔티티 자체를 컨트롤러까지 노출하는건 뭔가 꺼려집니다. 질문을 요약하자면, DTO를 서비스에서 리턴하는 방식과 서비스는 엔티티를 리턴하고 컨트롤러에서 DTO로 조합하여 최종 응답을 내보내는 방식 중 어떠한 것이 더 좋다고 생각하시는지 알고 싶습니다. (또는 실무에서 자주 사용하는 방식) 감사합니다 :)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring Security 관련 질문입니다.
안녕하세요! 로드맵대로 강의를 마치고 이제 실제로 토이 프로젝트를 구현해보고 있습니다. Authorization 헤더에 JWT토큰을 태워서 보내는 형태로 인증을 구현하려고 하는데요. 보통 Spring Security를 사용한다고 나와있어서 해당 라이브러리를 같이 설치한다음 작업하고 있습니다. 관련해서 검색하면서 살펴보고 있는데 제공하는 기능들이 너무나도 많아서 실무에서는 어떤걸 많이 사용하는지 정말 헷갈리네요. 찾아보니 @Secured, @PreAuthorize, @RolesAllowed 라는 3가지의 방법이 존재하는 것 같은데, 실무에서는 어떠한 방법을 사용하나요? (물론 요구사항에 따라 다르겠지만 일반적으로 사용하는걸 알려주시면 제가 검색해서 찾아보겠습니다ㅎㅎ개인적으로는 @PreAuthorize를 사용해서 엔드포인트마다 권한을 세분화하는게 좋다고 생각합니다.)
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
HATEOAS 이거 정말 그렇게 중요한건가요?
hateoas장점이 다음 액션의 링크(?)를 주는거라 했는데 어떻게 사용한다는 걸까요? { "id": 1, "name": "gwise", "joinDate": "2021-04-29T08:04:34.838+00:00", "password": "pass1", "ssn": "770530", "_links": { "all-users": { "href": "http://localhost:8088/users" } } }
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Controller DTO리턴 질문
안녕하세요. 영한님의 강좌에서는 컨트롤러에서 DTO를 리턴하는 방식을 사용하고 있더라구요. 그런데 인터넷을 찾아보니 ResponseEntity로 한번 감싸서 리턴하는 방식도 종종 사용하는 것 같습니다. (ResponseEntity를 사용하면 응답코드, 헤더등과 함께 좀 더 세밀하게 리턴값을 조절할 수 있기 때문인 것 같네요) 실무에서는 DTO를 그대로 반환하는 방식과 ResponseEntity로 감싸서 반환하는 방식 중 어떤 방식을 사용하나요? 감사합니다 :)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO의 위치에 관하여
Version 4 까지의 최적화를 하면서 Dto의 위치가 repository 까지 갔는데 DTO의 위치는 상황에 맞게 자유롭게 두는게 괜찮을까요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
메이븐말고 그래들로 만들어서하고싶은데
그래들로 만들어서 뷰를 그대로 넣고 따라하며 듣고있는데, 화면이 깨집니다. 기본 html은 나와서 사용이 가능한데, 흰화면에 html 밖에 안나오는데 해결방법이 없을까요??