본문 바로가기

전체 글119

스프링MVC 입문12 service/MemberServiceTest package com.danny.learningspring.service; import com.danny.learningspring.domain.Member; import com.danny.learningspring.repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; c.. 2022. 11. 11.
스프링MVC 입문11 service/MemverService package com.danny.learningspring.service; import com.danny.learningspring.domain.Member; import com.danny.learningspring.repository.MemberRepository; import com.danny.learningspring.repository.MemoryMemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); .. 2022. 11. 10.
스프링MVC 입문10 repository/MemoryMemberRepositoryTest.java package com.danny.learningspring.repository; import com.danny.learningspring.domain.Member; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.*; public class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @AfterEa.. 2022. 11. 10.
스프링MVC 입문09 domain/Member.class package com.danny.learningspring.domain; public class Member { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 식별자로 사용될 시스템이 정하는 id name은 회원 이름 repository/MemberRepository.interface package com.danny.learningsp.. 2022. 11. 10.
long타입 0과 0L 왜 long타입에는 L을 붙히는 걸까 강의를 듣다가 문득 궁금해졌다. 저 L은 안붙여도 오류 안나는데 왜 붙이는지 sequence로 int타입이 아닌 long타입을 쓰는 이유도 L을 안붙힌다면 아래와 같은 상황이 발생 2147483647에서 1만 더한 2147483648이 오류 이유 int타입인데 너무 숫자가 너무 크단다(int는 2147483647까지만 가능) long타입의 값은 변수에 담기전에 임시메모리에 저장되는데 이때 임시로 저장하기 위해 사용하는 기본 데이터 타입이 int라서이다. 마무리 앞서 말했던 궁금증중 하나였던 sequence로 long타입을 쓰는 이유도 이해가 됐다. 만약 sequence를 int로 선언을 했는데 2147483648번째 유저가 회원가입을 한다면 오류가 날테니... + f.. 2022. 11. 10.
스프링MVC 입문08 비즈니스 요구사항 정리 데이터 - 회원ID, 이름 기능 - 회원 등록, 조회 아직 데이터 저장소가 선정되지 않음(가상의 시나리오) 일반적인 웹 애플리케이션 계층 구조 컨트롤러 - 웹 MVC중 컨트롤러의 역할 서비스 - 핵심 비즈니스 로직 구현(중복가입 처리 등) 리포지토리 - 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인 - 비즈니스 도메인 객체(회원, 주문, 쿠폰 등 주로 DB에 저장하고 관리됨) 클래스 의존관계 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용 이미지.. 2022. 11. 9.
스프링MVC 입문07 API (@ResponseBody 사용 원리) 클라이언트 요청이 내장 톰캣 서버에서 요청에 맞는 컨트롤러에 맵핑된 메서드로 보냄 @ReponseBody가 붙어있으므로 HTTP의 BODY에 문자 내용을 직접 반환 반환할 때 viewResolver대신 HttpMessageConverter가 동작 기본 문자 처리는 StringHttpMessageConverter 가 동작 기본 객체 처리는 MappingJackson2HttpMessageConverter 가 동작(객체를 JSON으로 바꿔주는 유명 라이브러리는 Jackson과 구글에서 만든 Gson이 있는데 Spring에서는 기본으로 Jackson으로 제공) byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음(기본적으로 셋.. 2022. 11. 9.
스프링MVC 입문06 MVC와 템플릿 엔진 웹브라우저에서 요청을 보냄 내장 톰캣 서버에서 요청에 맞는 컨트롤러의 맵핑된 메서드로 보냄 컨트롤러에서 비즈니스 로직 처리 후 viewResolver에서 템플릿 엔진을 처리 html로 변환 후 클라이언트로 응답 hello-template.html hello! empty hello! empty - p태그안의 내용(content)는 없어도 되지만 적어줌으로써 안에 들어갈 내용을 협업하는 사람들에게 알릴 수 있음 ${name} - Controller에서 보낸 값을 치환 됨 Controller @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model){ model.addAttri.. 2022. 11. 9.
스프링MVC 입문05 웹 개발 정적 컨텐츠 - server에서 하는 일 없이 웹브라우저에 파일을 줌(그냥 파일 그대로 줌) MVC와 템플릿 엔진 - JSP, PHP와 같이 Server를 거쳐서 데이터를 HTML에 담아서 웹브러우저에 줌(Server에서 HTML을 변형시켜서) API - JSON(데이터 구조 포맷)을 통해서 클라이언트에게 데이터를 전달, 서버끼리 통신할 때 정적 컨텐츠 클라이언트에서 localhost:8080/hello-static.html 을 요청함 내장 톰캣 서버에서 제일 먼저 요청을 받음 스프링 컨테이너에서 요청에 맞는 컨트롤러를 찾아봄(컨트롤러가 우선 순위) 컨트롤러에서 맞는 요청을 찾지 못하고 resources에서 찾아봄 resources에서 찾은 /hello-static.html을 반환 hello-s.. 2022. 11. 9.