(linger0310.log 참고)
@Getter
public class UserDto {
public String userid;
public String password;
public SignInReq(String userid, String password) {
this.userid = userid;
this.password = password;
}
}
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
public class JpaMemberRepository implements MemberRepository{
...
@Override
public Member save(Member member) {
...
}
@Override
public Optional<Member> findById(Long id) {
...
}
@Override
public Optional<Member> findByName(String name) {
...
}
@Override
public List<Member> findAll() {
...
}
...
}
@GetMapping("/")
public String list(@RequestParam(value = "subject") String subject) throws JsonProcessingException {
List<Board> boards = boardService.getBoards(subject);
return mapper.writeValueAsString(boards);
}
@Configuration
public class SpringConfig {
private final EntityManager em;
public SpringConfig(EntityManager em) {
this.em = em;
}
@Bean
public BoardRepository boardRepository() {
return new JpaBoardRepository(em);
}
@Bean
public LikeRepository likeRepository() {
return new JpaLikeRepository(em);
}
}
GET방식으로 넘어온 URI의 queryString을 받기에 적절하다.
@GetMapping("/")
public String list(@RequestParam(value = "subject") String subject, Model model) throws JsonProcessingException {
List<Board> boards = boardService.getBoards(subject);
model.addAttribute("boards", mapper.writeValueAsString(boards));
return "board/list";
}
@Valid를 이용하면, service 단이 아닌 객체 안에서, 들어오는 값에 대해 검증을 할 수 있다.
SOP란 같은 Origin에만 요청을 보낼 수 있게 제한하는 보안 정책을 말한다.
Origin은 아래와 같은 구성을 이루어져 있다.
http://www.example.com/dir/page.html에 요청을 보낼 때 예시
CORS란 서로 다른 Origin끼리 요청을 주고 받을 수 있게 정해둔 표준이다. Spring에서는 @CrossOrigin
이라는 어노테이션을 이용하여 간단하게 CORS를 사용할 수 있다.
@CrossOrigin(origins = "http://localhost:8080") // 옆의 origin에서 접근 가능
@RestController
public class GreetingController {
@GetMapping("/hello")
public String hello() {
return "안녕하세요?";
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080");
}
}
헤더, 상태 코드, body를 담을 수 있다.
@Data
public class Message {
private StatusEnum status;
private String message;
private Object data;
public Message() {
this.status = StatusEnum.BAD_REQUEST;
this.data = null;
this.message = null;
}
}
public ResponseEntity<Message> findById(@PathVariable int id) {
Message message = new Message();
HttpHeaders headers= new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
message.setStatus(StatusEnum.OK);
message.setMessage("성공 코드");
message.setData(데이터);
return new ResponseEntity<>(message, headers, HttpStatus.OK);
}
생성자 호출 시점에 주입되기 때문에 싱글톤 원칙을 보장하고 불변, 필수 의존관계에 사용하면 좋다.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired // 생성자주입, 하나면 @Autowired생략가능
public OrderServiceImpl(MemberRepository memberRepository DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
자바 코드만으로 의존성을 주입해줄 수 있는 생성자와 달리, 필드 주입은 스프링 같은 DI프레임워크가 필요하다.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("프로젝트")
.description("~의 API 명세서")
.build();
}
}