diff --git a/build.gradle b/build.gradle index 3f2652e..511219f 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,8 @@ plugins { id 'java' } +apply plugin: 'java' +apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'org.dailystudio' @@ -20,8 +22,16 @@ repositories { } dependencies { + compile('org.springframework.boot:spring-boot-starter-cache') + testCompile('org.springframework.boot:spring-boot-starter-test') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compile('com.h2database:h2') + + testCompile('org.assertj:assertj-core:3.9.0') + implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + compile 'org.projectlombok:lombok:+' + annotationProcessor 'org.projectlombok:lombok:+' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java index 574a96e..44a039e 100644 --- a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java +++ b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java @@ -6,8 +6,8 @@ @SpringBootApplication public class SpringbootstudyApplication { - public static void main(String[] args) { - SpringApplication.run(SpringbootstudyApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringbootstudyApplication.class, args); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/config/CacheConfig.java b/src/main/java/org/dailystudio/springbootstudy/config/CacheConfig.java new file mode 100644 index 0000000..20fbaa6 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/config/CacheConfig.java @@ -0,0 +1,9 @@ +package org.dailystudio.springbootstudy.config; + +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableCaching +public class CacheConfig { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Board.java b/src/main/java/org/dailystudio/springbootstudy/domain/Board.java new file mode 100644 index 0000000..a0d13bf --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Board.java @@ -0,0 +1,28 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "BOARD") +@NoArgsConstructor +public class Board { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + @NotNull + private String content; + + public String getContent() { + return content; + } + + public Board(@NotNull String content) { + this.content = content; + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/BoardRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/BoardRepository.java new file mode 100644 index 0000000..1333ebf --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/BoardRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Board; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BoardRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/BoardService.java b/src/main/java/org/dailystudio/springbootstudy/service/BoardService.java new file mode 100644 index 0000000..22d3518 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/BoardService.java @@ -0,0 +1,38 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dailystudio.springbootstudy.domain.Board; +import org.dailystudio.springbootstudy.repository.BoardRepository; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +public class BoardService { + + private final BoardRepository boardRepository; + + @CacheEvict(value = "contents", allEntries = true) + public void saveContent(String content) { + Board board = new Board(content); + boardRepository.save(board); + } + + @Cacheable(value = "contents") + public List fetchContents() { + logCache(); + return boardRepository.findAll().stream() + .map(Board::getContent) + .collect(Collectors.toList()); + } + + private void logCache() { + log.info("new cache."); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..5046899 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ - +spring.h2.console.path=/h2 +spring.datasource.url=jdbc:h2:~/ds;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.h2.console.enabled=true +spring.jpa.hibernate.ddl-auto=create-drop diff --git a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java index 1cbed09..71a1031 100644 --- a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java +++ b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java @@ -9,8 +9,8 @@ @SpringBootTest public class SpringbootstudyApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } diff --git a/src/test/java/org/dailystudio/springbootstudy/service/BoardServiceTest.java b/src/test/java/org/dailystudio/springbootstudy/service/BoardServiceTest.java new file mode 100644 index 0000000..7b1b20a --- /dev/null +++ b/src/test/java/org/dailystudio/springbootstudy/service/BoardServiceTest.java @@ -0,0 +1,57 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class BoardServiceTest { + + private static final String DEFAULT_CONTENT = "default"; + + @Autowired + private BoardService boardService; + + private List contents; + + @After + public void tearDown() throws Exception { + log.info(contents.toString()); + } + + @Test + public void 캐시0() { + boardService.saveContent(DEFAULT_CONTENT); + contents = boardService.fetchContents(); + } + + @Test + public void 캐시1() { + contents = boardService.fetchContents(); + } + + @Test + public void 캐시2() { + contents = boardService.fetchContents(); + } + + @Test + public void 캐시3() { + boardService.saveContent("캐시3"); + contents = boardService.fetchContents(); + } + + @Test + public void 캐시4() { + contents = boardService.fetchContents(); + } +} \ No newline at end of file