inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

스프링 부트 3 - 하이버네이트 6 left join 최적화 설명 추가

해결됨

실전! 스프링 데이터 JPA

안녕하세요 선생님 제가 이해한 것이 맞는지 여쭤보고자 합니다. 제가 이해한 부분은 : 교재의 '여기서 만약 Member 와 Team 을 하나의 SQL로 한번에 조회하고 싶으시다면 JPA가 제공하는 fetch join 을 사용해야 한다. ( fetch join 은 JPA 기본편 참고) ' 이 부분에서 "select m from Member m left join fetch m.team t " 대신 "select m, t from Member m left join m .team t " 을 사용해도 되지 않을까 였습니다. 하지만 생각해보니 지연로딩으로 인해 아직 초기화 되지 않은 Team 엔티티의 Proxy 객체에서 Json Type Exception이 발생할 수 있어 fetch join을 사용하는 것을 추천하시는 것인지 하고 생각하고 있는데, 제가 생각하는 것이 맞나요?

  • java
  • spring
  • spring-boot
  • jpa
최종민 댓글 1 좋아요 1 조회수 427

테이블이 생성되지 않습니다

미해결

코드로 배우는 React 19 with 스프링부트 API서버

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mariadb:/ /localhost:3306/malldb spring.datasource.username=malldbuser spring.datasource.password=malldbuser spring.jpa.hibernate.ddl -au to = update spring.jpa.prop erties.hibernate.format_sql = true @Entity @ToString @Getter @Builder // Builder 를 사용하게 되면 아래 2개의 어노테이션도 함께 사용해야함 @AllArgsConstructor @NoArgsConstructor public class ToDo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; private boolean complete; private LocalDate dueDate; } 위처럼 properties 를 작성했는데 ToDo 테이블이 생성되지 않습니다...오류는 전혀 뜨지 않고 있습니다...무엇이 문제인지 잘 모르겠습니다

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
댓글 2 좋아요 0 조회수 1409

21강 create테스트 질문

미해결

[개념은 호옹~, 실습 빡] 스프링 부트, 입문!

테스트를 진행하면서 갑자기 createtest를 할때만 에러가 뜨길래 디버깅을 해보니 articleService 클래스 create메소드 return문에서 에러가 나더군요 그래서 article반환값이 돌아오질 않고 에러가 뜹니다 이전에 있던 create관련 질문과 같은 현상으로 보입니다. 보니까 Article에있는 어노테이션이 작동을 안하는건지 id값이 null로 반환이 됩니다 **추가로 질문드리자면 방금 기본 Article 페이지에서 생성을 했는데 처음몇번은 실패하고 그 다음에 다시 시도하니 create메소드가 정상 작동합니다 이건 어디서 잘못된 걸까요

  • spring-boot
최정식 댓글 1 좋아요 0 조회수 375

선생님 혹시 파일업로드도 알려주실수있나여?

해결됨

스프링 부트 웹 개발 입문 - 따라하며 배우기

재귀함수로 파일 삭제하고 머 다시 추가하고 머하는거있던데 잘모르겠습니다 이런것도 선생님 강의 올려주시면 좋을거 같아여 public void delFolderTrigger(String relativePath){ delFolder(uploadPrefixPath +relativePath); } // 처음에 폴더 페스가 들어가야함 public void delFolder(String folderpath) { //폴더 아래에 폴더 및 파일 삭제 , 보냈는 폴더는 삭제 안함 File folder = new File( folderpath); // 폴더가 존재하는지 묻는다 if (folder.exists()){ // 처음부터 다 객체화가 되서 리스트 로 넘어간다 File[] files = folder.listFiles(); // 재귀 함수 스택 이라 생각하면됨 // 일단 폴더 안에 다드가서 파일다지우고 그담 폴도 // 그담 계속 반복 for(File file : files) { if(file.isDirectory()) { delFolder(file.getAbsolutePath()); } else { file.delete(); } } folder.delete(); } } } public UserPicPatchDto patchUserPic(MultipartFile pic) { UserPicPatchDto dto = new UserPicPatchDto(); dto.setIuser(authenticationFacade.getLoginUserPk()); String target = "/user/"+dto.getIuser(); myFileUtils.delFolderTrigger(target); String saveedPicFileNm = myFileUtils.transferTo(pic,target); dto.setPic(saveedPicFileNm); int affectedRows = mapper.updUserPic(dto); return dto; }

  • spring
  • mvc
  • spring-boot
오꿀 댓글 1 좋아요 2 조회수 616

@Enumerated와 hibernate 타입 검증 관련 해결을 어떻게 해야할지 모르겠습니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요 강의에서 설명해주신 대로 따라하려고 했습니다. 단 , ddl-auto : create 대신 미리 SQL 문으로 테이블을 생성해놓고 ddl-auto: validate로 실행시 에러 가 납니다. 이는 실제로 배운 것을 사용할 수 없는 아주 치명적인 부분 이라고 생각하여 질문을 드립니다. [문제 설명] 강의에서 설명해주신대로 위와 같이 Enumerated 를 사용하여 status 를 정의 하였습니다. 말씀해주신대로 value = EnumType.STRING을 사용했습니다. UserStatus 는 당연히 enum 타입으로 했구요. @Column(name = "status", length = 32) @Enumerated(value = EnumType.STRING) private UserStatus status; 이때 status 가 있는 테이블은 아래와 같은 SQL문으로 생성하였습니다. VARCHAR(255)로 생성한 점을 자세히 봐주세요! dbms: MySQL CREATE TABLE user ( `id` BIGINT NOT NULL AUTO_INCREMENT, `status` VARCHAR(255) NOT NULL check (status in ('CREATED', 'WITHDRAW')), PRIMARY KEY (id) ); 또한 application-yml 에는 아래와 같이 ddl-auto 를 validate 로 하였습니다. jpa: hibernate: ddl-auto: validate properties: hibernate: format_sql: true show-sql: true 하지만 이를 실행하면 아래와 같은 status의 타입 오류 에러 가 나옵니다. Schema-validation: wrong column type encountered in column [status] in table [user]; found [varchar (Types#VARCHAR)], but expecting [enum ('created','withdraw') (Types#ENUM)] 이는 db의 status 의 타입이 enum 이길 기대했지만 실제로는 VARCHAR이기 때문에 에러가 발생한다는 것입니다. (ddl-auto의 validate에 의해 검증 수행) MySQL에서 타입에 enum을 적용하면 해결되지만 쓰는 것을 최대한 지양 해야 한다고 알고 있습니다. 따라서 mysql 의 status 컬럼의 타입을 enum 대신 column 타입을 varchar(255)로 두고 사용 하려고하는데 위와 같은 에러가 나서 실행이 되지 않습니다. ddl-auto : none 으로 설정하면 임시적으로 실행은 할 수 있지만 validate 로 검증을 항상 진행하려고 합니다. [질문 내용] 1. mysql의 타입을 varchar로 두고, ddl-auto: validate 를 사용하면서 에러 없이 실행할 수 있는 방법이 궁금합니다. 2. ddl-auto : create로 하게 되면 자동 생성되는 sql문에서는 status에 enum 대신 create table user ( id bigint not null, status varchar(255) check (status in ('CREATED', 'WITHDRAW')), primary key (id) ) 위처럼 varchar로 column 속성을 주면서 validate 할때만 에러가 나는것이 이상한 것 같은데 왜 그럴까요? 3. 이를 현업에서는 어떻게 해결하고 계신지 궁금합니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
임준호 댓글 3 좋아요 4 조회수 4196

안녕하세요 왜 저는 v3쿼리가 다르게 나오는 걸까요?

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

public List<Order> findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .getResultList(); } 이렇게 똑같이 했는데도 select o1_0.order_id, d1 _0.deliver y_id, d1 _0.cit y, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1 _0.cit y, m1_0.street, m1_0.zipcode, m1 _0.nam e, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1 _0.deliver y_id=o1 _0.deliver y_id 조인이 이상하게 되고 있습니다 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); @Id @GeneratedValue @Column(name = "delivery_id") private Long id; @JsonIgnore @OneToOne(mappedBy = "delivery") private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; //READY, COMP 잘못 연관 관계를 잘못 설정한걸까요?

  • java
  • spring
  • spring-boot
  • jpa
Azathoth 댓글 1 좋아요 0 조회수 508

MemberService 구현과 역할 분리

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의를 보면 MemberService의 경우 구현과 역할을 분리하지 않고 클래스 하나에서 전부 처리하는데 왜 역할과 구현을 따로 분리하지 않나요?

  • java
  • spring
  • mvc
  • spring-boot
박상훈 댓글 1 좋아요 0 조회수 484

코드 볼 수 있을까요?

미해결

실습으로 배우는 선착순 이벤트 시스템

코드 부탁드립니당 ㅜ

  • java
  • docker
  • spring-boot
  • kafka
  • redis
김시온 댓글 3 좋아요 0 조회수 739

spring initializr에서 강의 버전과 달라요

미해결

토비의 스프링 부트 - 이해와 원리

강의에서는 스프링부트 2.x버전이고 자바도 11이 있는데 지금은 스프링부트도 3.x버전만있고 자바도 21, 17만 있습니다 어떻게 해야되나요 이후 강의에서 하는걸 따라하는거에 차질이 없으려면 스프링부트와 자바 어떤 버전으로 해야하나요

  • spring
  • spring-boot
  • spring-jdbc
전영석 댓글 2 좋아요 0 조회수 846

빌드 실패..

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. ./gradlew build 오류입니다. 버전도 잘 맞춘거 같은데 왜이럴까요 ?ㅠㅠ 계속 빌드 실패하고 뜹니다.

  • java
  • spring
  • mvc
  • spring-boot
msj1291 댓글 3 좋아요 0 조회수 857

AWS pem 접속시 22번 포트 에러가 발생합니다.

해결됨

인프라공방 - 그럴듯한 서비스 만들기

안녕하세요. 강의 잘 듣고 있습니다. 처음에 보안그룹에 대한 설정을 해줬습니다. 그리고 맥으로 해본결과 ❯ ssh -i "xxx.pem" ubuntu@0.00.000.000 ssh: connect to host 0.00.000.000 port 22: Operation timed out 이라는 에러가 발생하는데 찾아보니 ssh 포트 22번을 열어줘야 된다고 하는데, 처음에 열어줬는데도 time out 에러가 발생한건지 잘 모르겠습니다.

  • 네트워크
  • linux
  • aws
  • mysql
  • spring-boot
조재연 댓글 1 좋아요 0 조회수 764

회원가입 테스트

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 회원가입 테스트에서 이름으로 테스트하는 대신 아이디를 비교하는 테스트로 해도 되나요? 이런 식으로요! // then assertThat(saveId).isEqualTo(member.getId());

  • java
  • spring
  • mvc
  • spring-boot
박태근 댓글 2 좋아요 0 조회수 417

QueryDSL 도입후 개발 방향을 궁금해서 질문드립니다

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 보통 QueryDSL과 Spring Data JPA를 같이 도입하게 되는데 여기서 궁금한점이 있습니다. QueryDSL을 도입하게 되면, 모든 DB관련 쿼리는 querydsl만 사용하나요?? 아니면 Spring data jpa도 혼용하시나요? 아니면 querydsl은 동적쿼리만 위한것인지? 혼용한다면 어떤 시기에 querydsl과 spring data jpa을 쓰는지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
두잇베스트 댓글 1 좋아요 0 조회수 573

아무리 봐도 틀린게 없고 다 참고 했는데 뭐가 문제인지 봐주세요

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 잘했는데 왜 안녕하세요 null. 이라고 뜨는지 모르겠습니다. ㅠㅠ 뭐가 문젠가요

  • java
  • spring
  • mvc
  • spring-boot
김병곤 댓글 1 좋아요 0 조회수 687

똑같이 따라했는데 왜 null이 뜰까용?

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 이런식으로 (안녕하세요 hello!!!) 가 안뜨고 (안녕하세요 null) 이 뜹니다. 뭐가 문제죵?

  • java
  • spring
  • mvc
  • spring-boot
김병곤 댓글 2 좋아요 0 조회수 503

스프링 웹

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

섹션2 부터 7까지는 웹에 대한 강의인가요? 앱개발 커리큘럼 듣고 싶으면 강사님 강의 중 ' 스프링 핵심 원리 - 기본편' 이거부터 들으면 될까요?

  • java
  • spring
  • mvc
  • spring-boot
hi 댓글 1 좋아요 0 조회수 268

아직 초반부분인데 질문이있습니다.

미해결

생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현

제가 타임리프말고 Vue를 사용하려고합니다 그리고 시큐리티를 사용하려고하는데 해당 강좌에 시큐리티가 없는건지요? 궁금한게 시큐리티를 적용안하고 보통 프로젝트를 만드나요?

  • spring-boot
  • jpa
  • web-api
성호 댓글 1 좋아요 0 조회수 223

챕터 3 임의로 URL에 size 값을 변경한 후 다른 페이지로 이동하면 size가 기본값 10으로 돌아갑니다.

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요 강사님 강의 수강중인 학생입니다. 일단 코드는 강의 내용이나 올려주신 부분하고 다른 점은 없는 것 같은데 원래 이렇게 되는 것인가요? page=1&size=1을 주면 글 하나씩 페이지가 생기는데 그 상태에서 페이지 번호 버튼을 눌러서 다른 페이지로 이동하면 size 파라미터 값이 기본값 10으로 돌아가네요 localhost:3000/todo/list?page=1&size=1 인 상태에서 페이지 번호 2번 버튼을 눌러서 이동하면 localhost:3000/todo/list?page=2&size=1 이렇게 되어야 하는 것 아닌가요? localhost:3000/todo/list?page=2&size=10 이렇게 되어버립니다. 코드를 계속 살펴보고 동작 방식을 생각해보니 클라이언트 쪽 코드상에서 page와 size값이 변하는 것을 받아변수에 저장하는 부분은 페이지 번호 버튼을 눌렀을때 useCustomMove의 size 변수와 sizeNum 변수인데 버튼을 통한 변화없이 임의로 URL에서 size를 바꾸고 페이지 번호 버튼을 누르면 저장된 size값은 10 그대로이기 때문에 그렇게 되는 것이 아닐까라는 추측을 해봅니다. size는 변동을 딱히 고려하지 않는 파라미터일 수도 있는데 여러가지로 궁금해져서 이런저런 시도를 해보다보니 의문이 생겼었네요. 실제로 웹개발을 할때 페이지를 나누는 경우 한 페이지의 size값은 변동이 없는 파라미터인가요? 기준을 정하기 위함인가요?

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
BCLOUD 댓글 1 좋아요 0 조회수 390

depracated된것들이 너무 많습니다 ㅠㅠ

미해결

스프링 시큐리티

신입 개발자로서 현업을 하며 security에 대해 실력을 키우고자 하여 강의를 듣고 있습니다. 그런데 기술중에 deprecated 된 기술들이 너무 많아 따라가는데 시간이 너무 많이 소요되는거 같습니다... 이것을 해결하기 위해 최신화 된 Git 레포지 주소나 해결 방안 같은것을 자막식으로 달아주실수 있을까요..? 아니면 버전을 다운그레이드해서 들어야하나요,,,?ㅜㅜ

  • java
  • spring-boot
  • spring-security
TAKE MUSIC 댓글 3 좋아요 0 조회수 579

회원 목록 조회가 안됩니다 ㅠㅠ

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 회원가입에서 spring1 , spring2 등록하고 회원 목록에 들어가면 #이름 만 뜹니다 ㅠㅠConsole 창에도 member = spring1 으로 잘 뜨는데 왜 안될까요?? 회원 목록에서 소스 보기하면 저 가운데가 코드가 안뜨는데 이거 때문일까요? 코드는 강의자료 그대로 복붙했습니다! 딱히 에러가 뜨는건 아니라 뭐가 잘못된지 모르겠네요 ㅠㅠ 구글 드라이브 첨부해드려요! https://drive.google.com/file/d/1s2D6rLue9yPAHlZbNnCFVKsv2aKGZtEX/view?usp=sharing 오류 해결했습니다^^;;; 주석처리된 부분이 있었네요 ...ㅠㅠㅎㅎㅎㅎㅎ

  • java
  • spring
  • mvc
  • spring-boot
asdf20834 댓글 1 좋아요 0 조회수 412

인기 태그

인프런 TOP Writers

주간 인기글