묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
섹션1. 빌드에러가 발생합니다.
. ..java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 예외가 발생하여 빌드가 되지 않습니다.자주 묻는 질문에도 해당 내용이 없는 것 같습니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
문법질문입니다.
코드를 제가 잘 이해하고 따라가는지 궁금합니다.질문1리포지토리에서 활성화가 되어있는 프로젝트만 가져와서 projects에 리스트 형태로 넣어서 다시 ProjectDTO 형태로 넣어서 컨트롤러에서 처리하게끔 해주는건가요? 질문2여기서 제가 이해한게 맞다면 return 할떄 projects.map을 왜 이용하는건가요? map은 키와 값으로 이루어 져있는 배열로 알고있는데 ProjectDTO가 키와 값으로 이루어져서 그런건가요?질문3ProjectDTO(it) 여기서 말하는 it은 무엇을 의미하는지 알수있나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@NotEmpty 어노테이션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@NotEmpty어노테이션이 임포트가 안됩니다 혹시 버전차이때문에 그런건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
slf4j 보안에 대해 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 slf4j가 보안에 취약하다고 Logback를 사용하라는 블로그글을 본 적이 있는데 혹시 사실인가요??보안이 뚫렸다고 표현을 해서 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 findAll듣던중에
다음 첨부파일처럼 공유자께(첨부1)서는 public UserResponse(long id, User user) { }가 있습니다.그런데 저는 지금까지 쓴 코드에서 첨부파일(첨부2)처럼 저 코드부분이 없습니다.몇강에서 놓친건가요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
순수 jdbc 질문 있어요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]순수 jdbc 강의 9분 2초에 string sql을 상수로 빼는 것이 더 나은 이유가 무엇인지 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 질문있습니다.
저장기능 변경에서 save를 하게 되면 저장된 User객체가 반환되는데 이때 id를 사용할 수도 있다.라고 했는데반환되는것이 User객체의 ID인건가요?그리고 꼭 반환 안하고 처음에 작성했던 public void saveUser(UserCreateRequest request) { userRepository.save(new User(request.getName(), request.getAge())); }이렇게 써도 되는건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 질문있습니다
JpaRepository를 UserRepository가 상속받게 해줄때, 만든 테이블의 매핑 객체인 User 와 유저 테이블의 id인 Long 타입을 각각 적어주어야 한다고 하셨는데 user객체는 이해가 가는데 갑자기 id인 Long타입은 왜 적나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
OncePerRequestFilter 질문
OncePerRequestFilter는 요청당 한 번만 필터가 동작하도록 보장된? 필터라고 말씀해주셨는게 하나의 요청에 하나의 필터가 여러 번 동작하는 경우도 있나요..?
-
미해결토비의 스프링 부트 - 이해와 원리
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
제가 이번 강의까지 보다가 한달만에 다시봐서 헷갈리는걸수도 있는데 갑자기 궁금하여 질문드립니다..Hikari 라이브러리를 gradle에서 가져오지 못하는 이슈 때문에 이번 강의의 커뮤니티 게시판에 다른 분이 작성한 글을 참고하여 토비님과 다르게 gradle에 implementation('com.zaxxer:HikariCP:4.0.3')를 추가해줘서 강의를 보고 있는데요.강의에서 DataSourceConfig 클래스 안에서 Hikari 관련된 빈을 등록하여 사용하려고 하는데, 이게 어떻게보면 Hikari 관련된 라이브러리가 있으면 사용하고, 아니면 기본 DataSource를 사용하게끔 하는 의도가 있는 자동구성등록하는 방법 이잖아요.. 근데 Hikari 라이브러리를 gradle에 추가 후, 토비님 처럼 테스트를 하면 Hikari가 DataSource로 사용되어 정상 동작하는데, 만약에 반대로 Hikari를 gradle에서 빼면 기본적인 SimpleDriverDataSource 객체가 사용되는게 예상을 하였는데, 당연하게도? gradle에서 Hikari 관련된 implement를 제거해버리면, SimpleDriverDataSource 객체를 사용하기 전에 DataSourceConfig 클래스 안에서 Hikari 관련된 로직들이, Hikari 라이브러리가 없기 떄문에 오류가 나지 않나요?즉, Hikari라는 라이브러리가 없도록, gradle에서 Hikari와 관련된 implements를 빼버리면 SimpleDriverDataSource 가 사용되는게 아니라, 애초에 소스에서 오류가 나는게 맞는건데.. 제가 어디부터 혼란이 온지 모르겠네요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
open-in-view값 true/false
@Controller @RequiredArgsConstructor @RequestMapping("/board") public class BoardController { @PostMapping("/update") public String update(@ModelAttribute BoardDTO boardDTO, Model model) { BoardDTO board = boardService.update(boardDTO); model.addAttribute("board", board); return "detail"; } } @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; public BoardDTO findById(Long id) { System.out.println("findById : "+ em.getDelegate()); // 이 아래 코드에서 질문 있습니다. Optional<BoardEntity> optionalBoardEntity = boardRepository.findById(id); if (optionalBoardEntity.isPresent()) { BoardEntity boardEntity = optionalBoardEntity.get(); return BoardDTO.toBoardDTO(boardEntity); } else { return null; } } public BoardDTO update(BoardDTO boardDTO) { System.out.println("update : "+ em.getDelegate()); BoardEntity boardEntity = BoardEntity.toUpdateEntity(boardDTO); boardRepository.save(boardEntity); return findById(boardDTO.getId()); } } @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @Getter public class BaseEntity { @CreationTimestamp @Column(updatable = false) private LocalDateTime createdTime; @UpdateTimestamp @Column(insertable = false) private LocalDateTime updatedTime; } @Entity @Getter @Setter @Table(name = "board_table") public class BoardEntity extends BaseEntity { @Id GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String boardWriter; private String boardPass; private String boardTitle; private String boardContents; private int boardHits; public static BoardEntity toUpdateEntity(BoardDTO boardDTO) { BoardEntity boardEntity = new BoardEntity(); boardEntity.setId(boardDTO.getId()); boardEntity.setBoardWriter(boardDTO.getBoardWriter()); boardEntity.setBoardPass(boardDTO.getBoardPass()); boardEntity.setBoardTitle(boardDTO.getBoardTitle()); boardEntity.setBoardContents(boardDTO.getBoardContents()); boardEntity.setBoardHits(boardDTO.getBoardHits()); return boardEntity; } } 위에 코드 상황에서 open-in-view를 true로 하면 optionalBoardEntity에 createdTime 값이 null입니다. 제 생각으로는 open-in-view가 true 이므로 update()에서 (createdTime 값이 없는) boardEntity가 영속성 컨텍스트 1차 캐시에 존재하고, findById()에서 boardRepository.findById(id) 값을 호출하지만 1차캐시에 있는 값을 줘서 최종적으로 boardEntity값에는 createdTime값이 없는 것으로 이해했습니다. 그런데 왜 open-in-view값을 false로 하면 boardEntity에 createdTime 값이 있는지 모르겠습니다. open-in-view가 true 이건 false 이건 영속성 컨텍스트 생존 범위에 Service는 포함되니 createdTime 값이 둘 다 없어야 되는것이 아닌지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 JdbcTemplate강의를 듣고 궁금한 점이 생겨 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]다른 강의의 내용에서 스프링 빈에 dataSource와 JdbcTemplate이 등록이 되어 있는 내용을 보았습니다.그래서 dataSource를 통해 DB와 커넥션을 만드는 부분에서는 새로운 객체를 생성하지 않고 dataSource를 받아와 의존성 주입을 받았는데 여기에서는 JdbcTemplate의 새로운 객체를 생성하여 의존성 주입을 받는데 그러면 싱글톤에서 위배가 되는것 아닌가요?다른 강의에서는 SQL을 DB로 사용하였습니다. 혹시 DB의 차이에 따라 위와 같이 새로운 JdbcTemplate의 객체를 생성할 수 있는 걸까요?
-
해결됨코드로 배우는 React 19 with 스프링부트 API서버
[스프링부트 3.2] RefreshToken 발급시 파라미터 오류
스프링부트 3.2 버전인데 APIRefreshController의 refresh의 파라미터중 String refreshToken만 적으면 -parameter 오류가 나네요. 인텔리제이에서 gradle로 빌드하거나 어노테이션에 이름을 붙여 적으니 잘 동작합니다. 식겁했습니다..
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.현재 컨트롤러에서 직접 리포지토리를 접근하는데 예전 강의에서 단순 엔티티 조회할때는 실용적인 관점으로 서비스를 통해 접근하는 것이 아닌 리포지토리로 바로 접근하기도 한다는걸 들었습니다. 이번 강의에 그 점이 적용이 된거 같습니다.여기서 궁금점은 jpa의 모든 데이터 변경은 트랜잭션 안에서 실행된다고 하셨는데 현재 레포지토리에 바로 접근하면서 @Transactional 애노테이션을 사용안하는 것을 확인하였습니다. 단순 조회에서는 트랜잭션을 시작할 필요가 없는 건가요? 아니면 숨겨진 기능이 있는건지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
14강. 유저 업데이트 API, 삭제 API 개발과 테스트 수정하기 안됨
코드대로 글을 잘 작성하고 POST,GET,DELETE도 전부 잘 동작하고 db에서도 확인이 되는데,수정하기만 동작하지 않습니다..어떻게 해야할까요..수정하기 버튼을 누를시 아무런 화면의 변화가 없습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepository { 질문이요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 해당 부분에서 오류 발생되는데 왜 그런 걸까요public class MemoryMemberRepository implements MemberRepository { 이부분에 빨간줄이 있습니다.package hello.hellospring.repository; import hello.hellospring.domain.Member; import java.util.*; /** * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려 */ public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> findByID(long id) { return Optional.ofNullable(store.get(id)); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } public void clearStore() { store.clear(); } }
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
ModelMapper 와 entityToDto 차이
강사님의 강의에서 엔티티를 DTO로 변환할때 2가지 방식을 다 보여주셨는데 , 모델 매퍼로 엔티티 -> DTO 변환방식과 entityToDto 메소드 처럼 직접 개발자가 명시해줘서 엔티티를 DTO로 변환하는 방식의 차이점과 선택기준이 궁금합니다!!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
섹션3 질문 있습니다
안녕하세요!섹션3 마지막 부분쯤 나온 @Component 어노테이션에 대해 질문이 있습니다!이 어노테이션은 다음과 같은 경우에 사용된다고 하셨는데요!컨트롤러, 서지스, 리포지토리가 모두 아니고,개발자가 직접 작성한 클래스를 스프링 빈으로 등록할 때 사용된다. 제가 궁금한 것은 Service 나 리포지토리 모두 우리가 직접 작성한 클래스 아닌가요??그러면 컴포넌트 어노테이션 아닌가요??답변해주시면 감사하겠습니다
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
섹션3 컨트롤러테스트 오류
안녕하세요. 강의노트와 강의를 보면서 수정해 보았는데 resume에서만 test가 실패합니다. 제가 보기엔 resume가 JSON이 null이라서 그런것 같은데 어느 부분을 봐야할지 모르겠습니다. Datainitiallizer.kt를 봐도 잘 안보이네요. 아래는 에러 메세지와 코드입니다.java.lang.NullPointerException: Cannot invoke "org.json.JSONArray.length()" because the return value of "org.json.JSONObject.optJSONArray(String)" is null at com.dogu.portfolio.presentation.controller.PresentationApiControllerTest.testGetResume(PresentationApiControllerTest.kt:66) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) @Test @DisplayName("resume") fun testGetResume() { //given val uri = "/api/v1/resume" //when val mvcResult = performGet(uri) val contentAsString = mvcResult.response.getContentAsString(StandardCharsets.UTF_8) val jsonObject = JSONObject(contentAsString) //then Assertions.assertThat(jsonObject.optJSONArray("experiences").length()).isPositive() Assertions.assertThat(jsonObject.optJSONArray("achievements").length()).isPositive() Assertions.assertThat(jsonObject.optJSONArray("skills").length()).isPositive() }
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join과 join feth 차이점
public List<Order> findSearchOrders(OrderSearch orderSearch){ return em.createQuery("select o from Order o join o.member m" + " where o.orderStatus = :status" + " and m.name like :name", Order.class) .setParameter("status", orderSearch.getOrderStatus() ) .setParameter("name", orderSearch.getMemberName()) .setMaxResults(1000) .getResultList(); } public List<OrderQueryDto> findQueryOrder() { List<OrderQueryDto> result = findAllOrder(); for (OrderQueryDto order : result) { List<OrderItemQueryDto> orderItems = findOrderItem(order.getId()); order.setOrderItems(orderItems); } return result; } public List<OrderItemQueryDto> findOrderItem(Long orderId) { String query = "select new jpabook.jpashop.repository.order.query." + " OrderItemQueryDto(oi.order.id, oi.orderPrice, oi.count )" + " from OrderItem oi " + " join oi.item i" + " where oi.order.id = :orderId"; return em.createQuery(query,OrderItemQueryDto.class) .setParameter("orderId", orderId) .getResultList(); } public List<OrderQueryDto> findAllOrder(){ String query = "select new jpabook.jpashop.repository.order.query." + " OrderQueryDto(o.id, m.name, d.address, o.orderStatus, o.orderDate) " + " from Order o " + " join o.member m" + " join o.delivery d"; return em.createQuery(query, OrderQueryDto.class).getResultList(); }첫번째 코드 블럭은 order를 select 할때 member를 join 하면 member를 프록시 객체로 가져오는걸로 알고 있습니다. join fetch 를 하게 되면 바로 객체로 가지고 오는걸로 알고 있습니다. 하지만, 두번째 코드 블럭은 그냥 join을 했는데, 왜 프록시 객체에서 객체로 전환? 프록시 객체가 객체를 가르키는 행위를 하지않고도 dto에 바로 삽입이 가능한가요?ex) order.getName() , member.getName()