Gallery
Search
EC2ํธ ์ฐธ๊ณ ์๋ฃ
https://wickies.tistory.com/102
https://dev-coco.tistory.com/68
EC2 Console์์ MySQL ์ด๊ธฐ ์ค์ ์ฐธ๊ณ
https://blogshine.tistory.com/322
https://amor-fati.tistory.com/156
RDS ์ฐ๊ฒฐํ๊ธฐ ํฌํจํธ ์ฐธ๊ณ
https://velog.io/@u-nij/Spring-Boot-AWS-RDS-MySQL-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
[Spring][HCD 12์ผ์ฐจ]69 ํํ๋ก์ ํธ ๋ฐฐํฌ์ ์ธ์ฆ์ ์ ์ฉ(์ฌ์ค์ตํ์!) [์์ฑ์ค!!
]
]์ฐ์ SSL๊น์ง ๊ณ ์ณ์ง๋ฉด ๋น ๋ฅด๊ฒ ์ด๋ถ๋ถํด๋ณด์!
Github Action์ ํตํด PR๋๋ Push๋ฑ์ ํตํด ์ด๋ ํ ์ก์
์ ๋ฐ๋ผ ๋ฐฐํฌ๋น๋๋ฅผ ์๋ํ ์ํค๋๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
ํ์ฌ ๋ฌธ์ ๋ ์์ ์ฌํญ์ด ์๊ธฐ๋ฉด ๋ด๊ฐ ์ง์ Filezilla๋ฅผ ํตํด EC2 ์ธ์คํด์ค์ jarํ์ผ์ ์
๋ก๋ํ๊ณ , ๊ทธ๊ฑธ ์คํ์ํค๋๋ฐ
์ด ํ๋ ํ๋ ํ๋๋ฅผ github action์ ํตํด ์๋ํ ์ํค๋ ๊ฒ์ด ๋ชฉํ์ธ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค. ๊ณ ์น๊ณ ์ด๋ค ๋ถ๋ถ๋ค์ด, ์ด๋ค ์ค์ ๋ค์ด ์ด ํ๋๋ค์ ์๋ํ์ํค๋์ง ํ์ธํด์ผ ํ๋ค. ์ ์ ์์ฑ์ค!!
[Spring][HCD ์ถ๊ฐ 3์ผ์ฐจ]72 CI/CD ํ์ดํ๋ผ์ธ? [์์ฑ์ค!!
]
]๋จ์ ํ
์คํธ ํด๋ณด๊ธฐ
Repository ๋จ์ ํ
์คํธ ํด๋ณด๊ธฐ
Service ๋จ์ ํ
์คํธ ํด๋ณด๊ธฐ
Controller ๋จ์ ํ
์คํธ ํด๋ณด๊ธฐ
[Spring][HCD 10์ผ์ฐจ]67 ํ
์คํธ์ฝ๋ ์์ฑํด๋ณด๊ธฐ [์์ฑ์ค!!
]
]ํ
์คํธ์ฝ๋ ๋ถ์กฑํ ๋ถ๋ถ ์๊ฐ
๊ฒ์ ๊ธฐ๋ฅ ํ
์คํธ ์ฝ๋ ๊ตฌํ ์ค
@ExtendWith(MockitoExtension.class)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์
MockitoAnnotations.initMocks(this)๋ฅผ + @BeforeEach ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
๊ฐ๋จํ๊ฒ ๊ฒ์์ ์ฑ๊ณต๊ณผ ์คํจ์ ๋ํ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
class SearchServiceTest {
@Mock
private MenuRepository menuRepository;
@Mock
private StoreRepository storeRepository;
@InjectMocks
private SearchService searchService;
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
@DisplayName("๋ฉ๋ด์ ๊ฐ๊ฒ ์ด๋ฆ์ผ๋ก ๊ฒ์ ์ฑ๊ณต")
public void testSearchStoresAndMenusByKeyword_Success() {
// given
String keyword = "1";
List<Menu> mockMenus = new ArrayList<>();
List<Store> mockStores = new ArrayList<>();
// ๊ฐ์ง ๋ฉ๋ด์ ๊ฐ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ Mock ์ค์
Menu menu1 = new Menu();
menu1.setMenuName("Menu 1");
Store store1 = new Store();
store1.setId(1L);
store1.setStoreName("Store 1");
menu1.setStore(store1);
mockMenus.add(menu1);
Menu menu2 = new Menu();
menu2.setMenuName("Menu 2");
Store store2 = new Store();
store2.setId(2L);
store2.setStoreName("Store 2");
menu2.setStore(store2);
mockMenus.add(menu2);
when(menuRepository.findByMenuNameContaining(keyword)).thenReturn(mockMenus);
when(storeRepository.findByStoreNameContaining(keyword)).thenReturn(mockStores);
// when
List<SearchResponseDto> responseDtos = searchService.searchStoresAndMenusByKeyword(keyword);
// then
assertEquals(mockMenus.size() + mockStores.size(), responseDtos.size());
// ๋ฉ๋ด ๊ฒ์ ๊ฒฐ๊ณผ ํ์ธ
for (Menu menu : mockMenus) {
assertTrue(responseDtos.stream().anyMatch(dto -> dto.getType().equals("menu")
&& dto.getStoreName().equals(menu.getStore().getStoreName())));
}
// ๊ฐ๊ฒ ๊ฒ์ ๊ฒฐ๊ณผ ํ์ธ
for (Store store : mockStores) {
assertTrue(responseDtos.stream().anyMatch(dto -> dto.getType().equals("store")
&& dto.getStoreName().equals(store.getStoreName())));
}
}
}
์ด ์ฝ๋์์์ ๋ฌธ์ ์ ์ Entity์ ์ง์ Setter ๋ฉ์๋๊ฐ ํ์ํ ์ ์ด์๋ค. ์ด๋ ํ
์คํธ ์ฝ๋๋ฅผ ์ํด์ ์ค์ ํ๋ก์ ํธ์ Entity ํด๋์ค์ @Setter๊ฐ ํ์ํด์ง๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ณํ ์ํฌ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ ธ์ ํ
์คํธ์ฝ๋์ ์๋์๋ ๋ค๋ฅด๊ฒ ์๋ํ์ง ์์ DB ์กฐ์์ด ๋ฐ์ํ ์ ์์ด ์ฌ๋ฐ๋ฅด์ง ์๋ค.
๋ฐ๋ผ์ Mockito ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํด๋ณด์๋ค.
[Spring][HCD ์ถ๊ฐ 2์ผ์ฐจ]71 ๊ฒ์๋ถ๋ถ ํ
์คํธ์ฝ๋ ์์ฑํด๋ณด๊ธฐ
HTTP๋?
HTTP๋ Hyper Text Transfer Protocol์ ์ค์๋ง๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํต์ ํ๋๋ฐ ์ ํด๋์ ๊ท์ฝ์ด๋ผ ํ ์ ์๋ค.
HTTP์ ์์ ์ฑ?
HTTP ํต์ ์ ํน๋ณํ ๋ณด์์ด ์๋ค. ์๋ฅผ๋ค์ด ์
์๋ฅผ ๊ฐ์ง์ฌ๋์ด HTTP์ ์ ํธ๋ฅผ ์ฝํํ๋ค๋ฉด ํต์ ๋ด์ฉ์ด ์ธ๋ถ์ ๋๋ฌ๋๊ฒ ๋๋ค. ํด๋น ํต์ ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๋ ์ค์ํ ๋ณด์์ด ๊ทธ๋๋ก ๋ณด์ฌ์ง ์ ์๋ค.
HTTPS ๊ฐ๋จ ์ฌ์ฉ์ด์
HTTP๋ ์ ์ก๊ณ์ธต์ TCP์์์ ๋์ํ๋ค. ์ฌ๊ธฐ์ SSL(Secure Sockets Layer)๋ผ๋ ๋ณด์ ๊ณ์ธต์ด ์ ์ก ๊ณ์ธต ์์ ์ฌ๋ผ๊ฐ๋ค. HTTPS๋ TCP์์โSSL์์โHTTP๋ฅผ ์น์ด์ ํต์ ํ๋๊ฒ์ผ๋ก ๋ณด์์ด ๋ณด์ฅ๋ ํต์ ์ ํ๋ ํ๋กํ ์ฝ์ด๋ค.
[Spring][HCD ์ถ๊ฐ 1์ผ์ฐจ]70-1 HTTPS ์ ์ฉ ์ด์

[Spring][HCD ์ถ๊ฐ 1์ผ์ฐจ]70-2 ACM-Route53-EC2 ๋ฐฐํฌ์ HTTPS ์ด์ ํธ๋ฌ๋ธ์ํ
- ๋๋ฉ์ธ๊ณผ Route53๋ถํฐ ๋ค์ ์ฐ๊ฒฐํ๊ธฐ
https:// ๋ก ์ ์์ ์ผ๋ก ์ ์์ด ์๋๋ค. ์ค์ ์ด ๋ญ๊ฐ ์๋ชป๋์๋ค. [์์ฑ์ค!!๐ง]
๋ฐฐํฌ ๋จ๊ณ์์ https ์ค์ ์ ์ํด์ SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์๋๋ฐ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์์๋ค.
1.
์๋ง์กด AWS ์๋น์ค ์ค Aws Certificate Manager (ACM) ์ ํตํด์ ๋ฌด๋ฃ๋ก SSL ๋ฐ๊ธ ๋ฐ๊ธฐ.
2.
๋๋ฉ์ธ ๋ฐ ํธ์คํ
์
์ฒด(ex: cafe24, ๊ฐ๋น์ ๋ฑ)์ผ๋ก ๋ถํฐ SSL ์ ๋ฃ ๋ฐ๊ธ ๋ฐ๊ธฐ.
์ด๋ฒ์ ์ ์ฉ์์ผ ๋ณธ ๊ฒ์ ACM์ ํตํด์ SSL์ ๋ฐ๊ธ ๋ฐ๊ณ , ์๋ง์กด ์ธํ๋ผ ํ๊ฒฝ ๋ด์์ ์ ์ฉ์ํค๋ ๋ฐฉ๋ฒ์ด์๋ค. ๋ฐฐํฌ ์ปดํจํฐ ์์ฒด๊ฐ EC2์ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์, ๋ญ๊ฐ ์๋์ผ๋ก ์ ์ฉ์์ผ ์ฃผ๋ ๊ฒ ๊ฐ์๋ค. ํ์ง๋ง ๋ญ๊ฐ ์์ํ๊ธดํ๋ค. ์๋ง์กด ์๋น์ค๋ ๋ญ๊ฐ ํธ์คํ
์ด๋ฐ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์์์ ์ฝ๊ฐ์ ํผ๋์ด ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ผ๋ก ์กฐ๊ธ ์์ ๋ถํฐ ํ๊ตญ์์ ์ฌ์ฉ๋์ค๋ cafe24๊ฐ์ ํธ์คํ
์
์ฒด์ ๋ฐฉ์๋ค์ด ๋ค์ด์๊ธด ํ์ง๋ง ๋ญ๊ฐ ํ๊ฐ๋ฆฐ๋ค..
ํ์ง๋ง cafe24, ๊ฐ๋น์ ๊ฐ์ ํ๊ตญ ์
์ฒด๋ค์ ์๋น์ค ํํ๋ ๋๋ถ๋ถ ๋น์ทํ๊ฒ ๋๊ปด์ก๋ค.
[Spring][HCD ์ถ๊ฐ 1์ผ์ฐจ]70 ACM-Route53-EC2 ๋ฐฐํฌ์ HTTPS ์ด์ ํธ๋ฌ๋ธ์ํ
์ค.. ์ฐ์ ๋คํธ์ํฌ CS์ ๋ํด ์ข ๋ ์ ํํ ์์๋ณด๊ธฐ
ํ
์คํธ ์ฝ๋๋?
TDD๋?
Mock? ๊ฐ์ง?
๋จ์ ํ
์คํธ๋?
[Spring][HCD 11์ผ์ฐจ]68 ํ
์คํธ ์ฝ๋? TDD๋? ๋ชจ์?Mock? Mockito? ๋จ์ํ
์คํธ? ํตํฉํ
์คํธ? [์์ฑ์ค!!
]
]
[Spring][HCD 8์ผ์ฐจ]63 AOP๋?
AOP ํ์ฉํ ๋ถ๋ถ์ ์๊ฐํด๋ณด๊ธฐ
Spring Boot ํ๋ก์ ํธ์์ AOP๋ฅผ ์ ์ฉํ๋ ๋ถ๋ถ๋ค์ด ๋ณดํต ์ด๋ค ๋ถ๋ถ๋ค์ธ์ง ๊ถ๊ธํ๋ค. ์ด๋์์ ์ฌ์ฉํด์ผ๊ฒ ๋ค ๋ผ๋ ๊ฒ ์์ฒด๊ฐ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ๋ ๊ณผ์ ์ธ๋ฐ, ์ด๋ค ์๋๋ฆฌ์ค์ ์ ํฉํ ์ง ๊ฐ์ด ์์๋ค. ํต์์ ์ผ๋ก AOP๋ฅผ ์ ์ฉํ๋ ์ฌ๋ก๋ค์ ์กฐ์ฌํ๋ค.
1.
๋ก๊น
(Logging): ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ AOP ์๋๋ฆฌ์ค ์ค ํ๋๋ ๋ก๊น
์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฌ ๋ถ๋ถ์์ ๋ก๊ทธ๋ฅผ ์ผ๊ด๋๊ฒ ๋จ๊ธฐ๋ ค๋ ๊ฒฝ์ฐ AOP๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
2.
ํธ๋์ญ์
๊ด๋ฆฌ(Transaction Management): ํธ๋์ญ์
์ ๊ด๋ฆฌํ๊ธฐ ์ํด AOP๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ฉ์๋ ๋๋ ํด๋์ค์ ํธ๋์ญ์
๊ด๋ฆฌ ๋ก์ง์ ์ ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
์ ์์ํ๊ณ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ ์ ์๋ค.
3.
์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ(Authentication and Authorization): AOP๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๊ด๋ จ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ฌ์ฉ์ ์ธ์ฆ์ ํ์ธํ๊ณ ๊ถํ์ ๊ฒ์ฌํ ์ ์๋ค.
4.
์บ์ฑ(Caching): AOP๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ๋ฉ์๋ ํธ์ถ์ ๋ฐ๋ณต ์์
์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค.
5.
์์ธ ์ฒ๋ฆฌ(Exception Handling): AOP๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ ์ฒ๋ฆฌ ๋ก์ง์ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋ค. ํนํ, ์ฌ๋ฌ ๋ฉ์๋์์ ๊ณตํต์ผ๋ก ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํ๋ค.
6.
๋ฉ์๋ ์คํ ์๊ฐ ์ธก์ (Measuring Method Execution Time): AOP๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ณ ์ฑ๋ฅ ํต๊ณ๋ฅผ ์์งํ ์ ์๋ค.
[Spring][HCD 8์ผ์ฐจ]64 AOP ์ ์ฉ
Load more


