Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class DiscodeitApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args);

UserService userService = context.getBean(UserService.class);
/* UserService userService = context.getBean(UserService.class);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주석보다 테스트 로직을 삭제하는 편이 좋아보입니다.

주석의 경우 차후 미사용하거나 잊혀지는 경우가 많아서 제거하거나
따로 Test 파일을 만들어서 관리하는 편이 좋습니다.

ChannelService channelService = context.getBean(ChannelService.class);
MessageService messageService = context.getBean(MessageService.class);
ReadStatusService readStatusService = context.getBean(ReadStatusService.class);
Expand All @@ -30,10 +30,7 @@ public static void main(String[] args) {
Channel channel = setupChannel(channelService);
messageCreateTest(messageService, channel, user);

/* 유저의 회원가입 로그인, 채널생성, 메세지 발송, 마지막 접속상태까지의 전체 시나리오를 검증하는 과정
메인 메서드 내에 변수명이 겹쳐서 항목별로 변수명을 명확히 분리하여 가독성 높임
데이터를 주고 받을때 엔티티를 직접 노출하지않고 ex)UserStatusResponse같은 DTO(Record)를 활용하여 필요한 정보만 안전하게전달
*/

System.out.println("\n=== Discodeit 테스트 시작 ===");

User scenarioUser = userService.create(new UserCreateRequest("haha", "haha@co.com", "ha1234", null));
Expand Down Expand Up @@ -102,6 +99,7 @@ private static void messageCreateTest(MessageService messageService, Channel cha
null
);
Message message = messageService.create(request);
System.out.println("메시지 생성: " + message.getId());
System.out.println("메시지 생성: " + message.getId()); */
}
}
}

Original file line number Diff line number Diff line change
@@ -1,86 +1,88 @@
package com.sprint.mission.discodeit;

import com.sprint.mission.discodeit.dto.ChannelCreateRequest;
import com.sprint.mission.discodeit.dto.MessageCreateRequest;
import com.sprint.mission.discodeit.dto.ReadStatusCreateRequest;
import com.sprint.mission.discodeit.dto.UserCreateRequest;
import com.sprint.mission.discodeit.entity.Channel;
import com.sprint.mission.discodeit.entity.ChannelType;
import com.sprint.mission.discodeit.entity.Message;
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.*;
import com.sprint.mission.discodeit.repository.file.FileBinaryContentRepository;
import com.sprint.mission.discodeit.repository.file.FileChannelRepository;
import com.sprint.mission.discodeit.repository.file.FileMessageRepository;
import com.sprint.mission.discodeit.repository.file.FileUserRepository;
import com.sprint.mission.discodeit.repository.jcf.JcfReadStatusRepository;
import com.sprint.mission.discodeit.repository.jcf.JcfUserStatusRepository;
import com.sprint.mission.discodeit.service.ChannelService;
import com.sprint.mission.discodeit.service.MessageService;
import com.sprint.mission.discodeit.service.ReadStatusService;
import com.sprint.mission.discodeit.service.UserService;
import com.sprint.mission.discodeit.service.basic.BasicChannelService;
import com.sprint.mission.discodeit.service.basic.BasicMessageService;
import com.sprint.mission.discodeit.service.basic.BasicReadStatusService;
import com.sprint.mission.discodeit.service.basic.BasicUserService;

public class JavaApplication2 {
static User setupUser(UserService userService) {
UserCreateRequest request = new UserCreateRequest(
"woody",
"woody@codeit.com",
"woody1234",
null
);
return userService.create(request);
}
private static Channel setupChannel(ChannelService channelService) {
ChannelCreateRequest request = new ChannelCreateRequest(
"공지",
"공지 채널입니다.",
null
);
return channelService.createPublic(request);
}

private static void messageCreateTest(MessageService messageService, Channel channel, User author) {
MessageCreateRequest request = new MessageCreateRequest(
"안녕하세요.",
channel.getId(),
author.getId(),
null // 첨부파일(지금은 없으므로 null 전달)
);

Message message = messageService.create(request);
System.out.println("메시지 생성: " + message.getId());
}
public static void main(String[] args) {
// 레포지토리 초기화
UserRepository userRepository = new FileUserRepository();
ChannelRepository channelRepository = new FileChannelRepository();
MessageRepository messageRepository = new FileMessageRepository();
ReadStatusRepository readStatusRepository = new JcfReadStatusRepository();
BinaryContentRepository binaryContentRepository = new FileBinaryContentRepository();

// 서비스 초기화
UserStatusRepository userStatusRepository = new JcfUserStatusRepository();
UserService userService = new BasicUserService(userRepository, userStatusRepository);
ChannelService channelService = new BasicChannelService(channelRepository, readStatusRepository, messageRepository);
MessageService messageService = new BasicMessageService(messageRepository, channelRepository, userRepository, binaryContentRepository);
ReadStatusService readStatusService = new BasicReadStatusService(readStatusRepository, userRepository, channelRepository);

// 셋업
User user = setupUser(userService);
Channel channel = setupChannel(channelService);
// 테스트
messageCreateTest(messageService, channel, user);
ReadStatusCreateRequest rsRequest = new ReadStatusCreateRequest(
user.getId(),
channel.getId(),
null // 처음에는 읽은 메시지가 없으므로 null을 넣습니다.
);

readStatusService.create(rsRequest);
System.out.println("읽음 상태 생성 완료!");
}
}
//package com.sprint.mission.discodeit;
//
//import com.sprint.mission.discodeit.dto.ChannelCreateRequest;
//import com.sprint.mission.discodeit.dto.MessageCreateRequest;
//import com.sprint.mission.discodeit.dto.ReadStatusCreateRequest;
//import com.sprint.mission.discodeit.dto.UserCreateRequest;
//import com.sprint.mission.discodeit.entity.Channel;
//import com.sprint.mission.discodeit.entity.ChannelType;
//import com.sprint.mission.discodeit.entity.Message;
//import com.sprint.mission.discodeit.entity.User;
//import com.sprint.mission.discodeit.repository.*;
//import com.sprint.mission.discodeit.repository.file.FileBinaryContentRepository;
//import com.sprint.mission.discodeit.repository.file.FileChannelRepository;
//import com.sprint.mission.discodeit.repository.file.FileMessageRepository;
//import com.sprint.mission.discodeit.repository.file.FileUserRepository;
//import com.sprint.mission.discodeit.repository.jcf.JcfReadStatusRepository;
//import com.sprint.mission.discodeit.repository.jcf.JcfUserStatusRepository;
//import com.sprint.mission.discodeit.service.ChannelService;
//import com.sprint.mission.discodeit.service.MessageService;
//import com.sprint.mission.discodeit.service.ReadStatusService;
//import com.sprint.mission.discodeit.service.UserService;
//import com.sprint.mission.discodeit.service.basic.BasicChannelService;
//import com.sprint.mission.discodeit.service.basic.BasicMessageService;
//import com.sprint.mission.discodeit.service.basic.BasicReadStatusService;
//import com.sprint.mission.discodeit.service.basic.BasicUserService;
//
//import java.util.Optional;
//
//public class JavaApplication2 {
// static User setupUser(UserService userService) {
// UserCreateRequest request = new UserCreateRequest(
// "woody",
// "woody@codeit.com",
// "woody1234",
// null
// );
// return userService.create(request, Optional.empty());
// }
// private static Channel setupChannel(ChannelService channelService) {
// ChannelCreateRequest request = new ChannelCreateRequest(
// "공지",
// "공지 채널입니다.",
// null
// );
// return channelService.createPublic(request);
// }
//
// private static void messageCreateTest(MessageService messageService, Channel channel, User author) {
// MessageCreateRequest request = new MessageCreateRequest(
// "안녕하세요.",
// channel.getId(),
// author.getId(),
// null // 첨부파일(지금은 없으므로 null 전달)
// );
//
// Message message = messageService.create(request);
// System.out.println("메시지 생성: " + message.getId());
// }
// public static void main(String[] args) {
// // 레포지토리 초기화
// UserRepository userRepository = new FileUserRepository();
// ChannelRepository channelRepository = new FileChannelRepository();
// MessageRepository messageRepository = new FileMessageRepository();
// ReadStatusRepository readStatusRepository = new JcfReadStatusRepository();
// BinaryContentRepository binaryContentRepository = new FileBinaryContentRepository();
//
// // 서비스 초기화
// UserStatusRepository userStatusRepository = new JcfUserStatusRepository();
// UserService userService = new BasicUserService(userRepository, userStatusRepository);
// ChannelService channelService = new BasicChannelService(channelRepository, readStatusRepository, messageRepository);
// MessageService messageService = new BasicMessageService(messageRepository, channelRepository, userRepository, binaryContentRepository);
// ReadStatusService readStatusService = new BasicReadStatusService(readStatusRepository, userRepository, channelRepository);
//
// // 셋업
// User user = setupUser(userService);
// Channel channel = setupChannel(channelService);
// // 테스트
// messageCreateTest(messageService, channel, user);
// ReadStatusCreateRequest rsRequest = new ReadStatusCreateRequest(
// user.getId(),
// channel.getId(),
// null // 처음에는 읽은 메시지가 없으므로 null을 넣습니다.
// );
//
// readStatusService.create(rsRequest);
// System.out.println("읽음 상태 생성 완료!");
// }
//}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.sprint.mission.discodeit.controller;

import com.sprint.mission.discodeit.dto.LoginRequest;
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;

@PostMapping("/login")
public ResponseEntity<User> login(@RequestBody LoginRequest request) {
User user = authService.login(request);
return ResponseEntity.ok(user);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.sprint.mission.discodeit.controller;

import com.sprint.mission.discodeit.dto.BinaryContentCreateRequest;
import com.sprint.mission.discodeit.entity.BinaryContent;
import com.sprint.mission.discodeit.service.BinaryContentService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("/api/binary-contents")
@RequiredArgsConstructor
public class BinaryContentController {

private final BinaryContentService binaryContentService;

@GetMapping("/{id}")
public ResponseEntity<byte[]> download(@PathVariable UUID id) {
BinaryContent content = binaryContentService.find(id);

String contentDisposition = "attachment; filename=\"file_" + id + "\"";

return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) // 다운로드 파일명 설정
.contentType(MediaType.APPLICATION_OCTET_STREAM) // 이진 데이터 타입 설정
.body(content.getBytes()); // 실제 바이트 데이터
}

@PostMapping
public ResponseEntity<BinaryContent> create(@RequestBody BinaryContentCreateRequest request) {
BinaryContent savedContent = binaryContentService.create(request);
return ResponseEntity.status(HttpStatus.CREATED).body(savedContent);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BinaryContent Entity를 그대로 반환하지 말고 다른 DTO등으로 감싸주세요.

해당 Entity 내부에 byte코드도 같이 json으로 반환하게 되면서 부하가 생깁니다.

}

@GetMapping
public ResponseEntity<List<BinaryContent>> findAll(@RequestParam List<UUID> ids) {
List<BinaryContent> contents = binaryContentService.findAllByIds(ids);
return ResponseEntity.ok(contents);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.sprint.mission.discodeit.controller;

import com.sprint.mission.discodeit.dto.ChannelCreateRequest;
import com.sprint.mission.discodeit.dto.ChannelDto;
import com.sprint.mission.discodeit.dto.ChannelUpdateRequest;
import com.sprint.mission.discodeit.entity.Channel;
import com.sprint.mission.discodeit.service.ChannelService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("/api/channel")
@RequiredArgsConstructor
public class ChannelController {

private final ChannelService channelService;

@PostMapping("/public")
public ResponseEntity<Channel> createPublic(@RequestBody ChannelCreateRequest request) {
Channel channel = channelService.createPublic(request);
return ResponseEntity.status(HttpStatus.CREATED).body(channel);
}

@PostMapping("/private")
public ResponseEntity<Channel> createPrivate(@RequestBody ChannelCreateRequest request) {
Channel channel = channelService.createPrivate(request);
return ResponseEntity.status(HttpStatus.CREATED).body(channel);
}

@GetMapping("/{userId}")
public ResponseEntity<List<ChannelDto>> findAllByUserId(@PathVariable UUID userId) {
List<ChannelDto> channels = channelService.findAllByUserId(userId);
return ResponseEntity.ok(channels);
}

@PatchMapping("/{id}")
public ResponseEntity<ChannelDto> update(
@PathVariable UUID id,
@RequestBody ChannelUpdateRequest request) {
Channel updatedChannel = channelService.update(id, request);
return ResponseEntity.ok(toDto(updatedChannel));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable UUID id) {
channelService.delete(id);
return ResponseEntity.noContent().build();
}

private ChannelDto toDto(Channel channel) {
return new ChannelDto(
channel.getId(),
channel.getType(),
channel.getName(),
channel.getDescription(),
new ArrayList<>(), // 참여자 명단은 일단 빈 리스트로 처리
Instant.now()
);
}

@GetMapping
public ResponseEntity<List<Channel>> findAll() {
return ResponseEntity.ok(null);
}
}
Loading