์๋
ํ์ธ์. MovieLog
์ Back-end
ํ์ด์ง์
๋๋ค!
- ์ํ์ ๊ดํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- Spring Security์ JWT๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ ์๋ณํฉ๋๋ค.
- ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์๋ ์ํ์ ๊ดํ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ๋ก๊ทธ์ธํ์ง ์์ผ๋ฉด ์์ฑ๋ ๋ฆฌ๋ทฐ๋ง ๋ณผ ์ ์์ต๋๋ค.
- Server
- Java
- SpringBoot
- JPA
- Spring Data JPA
- JWT
- Amazon EC2
- Junit5
- Database
- H2(local)
- Maria DB
- Amazon RDS
- CI
- Travis CI
- CodeDeploy
- Amazon S3
- ํ๋ก์ ํธ๋ ํ๋ก ํธ์๋ 1์ธ, ๋ฐฑ์๋ 1์ธ์ผ๋ก ๋๋์ด ๊ฐ๋ฐํ์ต๋๋ค.
- ํ๋ก ํธ์๋๋ react๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ํ๋ก ํธ์ํธ ํ๋ก์ ํธ๋ฅผ ๋ฐฑ์๋ ํ๋ก์ ํธ ์์ ํฌํจํด ๋ฐฐํฌํ์๊ณ , ์๋ ํจํค์ง ๊ตฌ์กฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
- ํ๋ก ํธ์๋ ์ ์ฅ์ readme์์๋ ๊ตฌํ ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
Backend ํจํค์ง ๊ตฌ์กฐ ํ์ธ
โญ๏ธmovielog-serverโญ๏ธ
โโโ src
โโโ main
โย ย โโโ java
โย ย โย ย โโโ com
โย ย โย ย โโโ web
โย ย โย ย โโโ movielog
โย ย โย ย โโโ configure
โย ย โย ย โโโ controller
โย ย โย ย โย ย โโโ movie
โย ย โย ย โย ย โโโ order
โย ย โย ย โย ย โโโ profile
โย ย โย ย โย ย โโโ review
โย ย โย ย โย ย โโโ user
โย ย โย ย โโโ model
โย ย โย ย โย ย โโโ movie
โย ย โย ย โย ย โโโ order
โย ย โย ย โย ย โโโ review
โย ย โย ย โย ย โโโ user
โย ย โย ย โโโ repository
โย ย โย ย โย ย โโโ movie
โย ย โย ย โย ย โโโ order
โย ย โย ย โย ย โโโ review
โย ย โย ย โย ย โโโ user
โย ย โย ย โโโ security
โย ย โย ย โโโ service
โย ย โโโ โญ๏ธmovielog-clientโญ๏ธ
โย ย โโโ resources
โโโ test
โโโ java
โย ย โโโ com
โย ย โโโ example
โย ย โโโ movielog
โย ย โโโ controller
โย ย โโโ repository
โย ย โโโ service
โโโ resources
Frontend ํจํค์ง ๊ตฌ์กฐ ํ์ธ
โญ๏ธmovielog-clientโญ๏ธ
โโโ src
โโโ api
โโโ components
โย ย โโโ Header
โย ย โโโ Join
โย ย โโโ Login
โย ย โโโ Main
โย ย โโโ MovieDetail
โย ย โโโ MovieOrder
โย ย โโโ My
โย ย โโโ MyOrder
โย ย โโโ MyReview
โย ย โโโ OrderInfo
โย ย โโโ Profile
โย ย โโโ ReviewBoard
โย ย โโโ ReviewEdit
โย ย โโโ ReviewWrite
โโโ hooks
- MOVIE API
- ๋ฉ์ธ ํ๋ฉด (์ ์ฒด ์กฐํ)
- GET
/movie
- GET
- ์ํ ์์ธ (๊ฐ๋ณ ์กฐํ)
- GET
/movie/{movieId}
- GET
- ๋ฉ์ธ ํ๋ฉด (์ ์ฒด ์กฐํ)
- USER API
- Spring Security & JWT ์ ์ฉ
- ํ์ ๊ฐ์
- POST
/join
- POST
- ๋ก๊ทธ์ธ
- ๋๋ค์ ์์ (USER ROLE ํ์ ํ์ด์ง)
- GET
/user/me
(front - ์์ ํ์ด์ง) - POST
/user/me
- GET
- ํ์ ํํด
- DELETE
/user
- DELETE
- REVIEW API
- ๋ฆฌ๋ทฐ ์์ฑ
- GET
/review/write/{movieId}
(front - ์์ฑ ํ์ด์ง) - POST
/review/wirte/{movieId}
- GET
- ์ ์ฒด ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํ
- GET
/review
- GET
- ๋์ ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํ (USER ROLE ํ์ ํ์ด์ง)
- GET
/my/review
- findAllByUser(review)๋ก ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์กฐํ
- GET
- ๋ฆฌ๋ทฐ ์์ฑ
- ORDERS API
- ์ํ ์ฃผ๋ฌธ
- GET
/order/{movieId}
(front - ๊ตฌ๋งค ํ์ด์ง) - POST
/order/{movieId}
- GET
- ๋์ ์ฃผ๋ฌธ ๋ชฉ๋ก ์ ์ฒด ์กฐํ (USER ROLE ํ์ ํ์ด์ง)
- GET
/my/order
- findAllByUser(order)๋ก ๊ตฌ๋งค ๋ชฉ๋ก ์กฐํ
- GET
- ๋์ ์ฃผ๋ฌธ ๋ชฉ๋ก ๊ฐ๋ณ ์กฐํ (USER ROLE ํ์ ํ์ด์ง)
- GET
/my/order/{orderId}
- GET
- ์ํ ์ฃผ๋ฌธ
- AWS EC2, RDS์ ์ฐ๋ํ์ฌ ๋ฐฐํฌ ์์
์งํ
- ํ๋ฆฌํฐ์ด์ EC2 ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํ์ ์ด์
- ๋๋ฉ์ธ ์ฐ๊ฒฐ
- HTTPS ์ ์ฉ
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
Spring Security is a framework that focuses on providing bothauthentication and authorization
to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements. ์ฐธ๊ณ ํ์ด์ง
- Spring ๊ธฐ๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ์ค ๋ณด์ ํ๋ ์์ํฌ
- ์ฌ์ฉ์ ์ธ์ฆ, ์ธ๊ฐ ๋ฐ ๋ณด์์ ์ ๊ณต
- ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น ํ์ ์ธ๊ฐ ์ ์ฐจ๋ฅผ ์งํํจ
- ์ธ์ฆ(Authentication) : ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง, ํด๋น ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ด ๋ง๋์ง ํ์ธํ๋ ์ ์ฐจ
- ์ธ๊ฐ(Authorization) : ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ๊ฒฐ์ ํ๋ ์ ์ฐจ
ํ๋ก์ ํธ์ Spring Security๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์กด์ฑ ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-security'
ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ ์์คํ
์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ์ฆ ๋ฐฉ์ ์ค ํ๋
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties. ์ฐธ๊ณ ํ์ด์ง
JWT ๊ตฌ์กฐ
- . ๋ฅผ ๊ตฌ๋ถ์๋ก ๋๋์ด์ง๋ ์ธ ๊ฐ์ง ๋ฌธ์์ด์ ์กฐํฉ
- Header, Payload, Signature๋ก ์ด๋ฃจ์ด์ ธ ์์
- Header : ํ ํฐ์ ํ์ , ์ํธ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌ์ฑ
- Payload : ์ค์ ๋ก ํ์์ ๊ตฌ๋ถํ ์ ์๋ ์ ๋ณด(Claim) ํฌํจ (๋ฏผ๊ฐ ์ ๋ณด[ex. ๋น๋ฐ๋ฒํธ ๋ฑ]๋ ํฌํจํ๋ฉด ์ ๋จ)
- Signature : Header์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์ ํ์ฉ, Secret Key๋ฅผ ํฌํจํ์ฌ ์ํธํ
์ฌ์ฉ์ ์๋ณ ๊ณผ์
- ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋๋ฉด ์๋ฒ์์๋ JWT๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ
- ํด๋ผ์ด์ธํธ์์๋ ๊ทธ JWT๋ฅผ ๋ฐ์์ ๊ฐ์ง๊ณ ์๋ค๊ฐ, ์๋ฒ์ API ์์ฒญ ์ JWT๋ฅผ HTTP Header์ ๋ด์์ ๋ณด๋
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ JWT๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ์๋ณ
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ์๋์ ๊ฐ์ JWT๊ฐ ์์ฑ
ex) eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJoaUBnbWFpbC5jb20iLCJyb2xlcyI6W10sImlhdCI6MTY2NDI1Njc4OSwiZXhwIjoxNjY0MjU4NTg5fQ.ySIGyzKAJscUnYRtbAepRUotaohWtNpl2ja-REYMOmI
- JWT๋ Statelessํ๊ฒ ์๋ฒ์์ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ์๋ ์๋จ์ ์ ๊ณตํจ
- ๋ํ JWT๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์์
JWT ์์กด์ฑ ์ถ๊ฐ ์ค์
implementation 'io.jsonwebtoken:jjwt:0.9.1'
์๋ฒ์ ๋ก๊ทธ์ธํ์ฌ JWT๋ฅผ ์์ฑํ๋ ๊ณผ์
-
๋ก๊ทธ์ธ ์์ฒญ์ด ์ค๋ฉด Controller๋ฅผ ํตํด UserService.java์ login ์คํ
// Userservice.java์์ JWT ๋ฆฌํด return jwtTokenProvider.createToken(user.getUsername(), user.getRoles());
-
ํด๋ผ์ด์ธํธ์ ์ ๋ ฅํ id & password๊ฐ ์ผ์นํ๋ฉด JWT ์์ฑ
public String createToken(String userPk, List<String> roles) { Claims claims = Jwts.claims().setSubject(userPk); // Payload์ ์ ์ฅ๋๋ ์ ๋ณด ๋จ์ claims.put("roles", roles); Date now = new Date(); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) // ํ ํฐ ๋ฐํ ์๊ฐ ์ค์ .setExpiration(new Date(now.getTime() + tokenValidTime)) // ํ ํฐ ๋ง๋ฃ ์๊ฐ ์ค์ .signWith(SignatureAlgorithm.HS256, secretKey) // Signature์ ์ฌ์ฉํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ, secret ๊ฐ ์ค์ .compact(); }
-
Postman์ผ๋ก ํ ์คํธ
POST: /login
์์ฒญ์ ๋ณด๋ด๋ฉด ํ ํฐ์ ์์ฑํด ๋ฐํํ๋ฉฐ- ์ด ํ ํฐ์ ํ๋ก ํธ์๋์ ์ ์ฅํ๊ฒ ๋จ
API ์์ฒญ ์ ํ๋ก ํธ์๋์์๋ Header์ JWT๋ฅผ ๋ด์ ๋ณด๋
- ๋๋ค์ ์์ ๊ณผ ๊ฐ์ ๊ถํ์ด ํ์ํ ์์ฒญ์ด ์ฌ ๋๋ง๋ค, ์๋ฒ๋ Header์ X-AUTH-TOKEN์ ๋ด๊ธด JWT์ ๊ฐ์ ธ์ด
public String resolveToken(HttpServletRequest request) { return request.getHeader("X-AUTH-TOKEN"); }
- ๊ฐ์ ธ์จ JWT์์ ์ฌ์ฉ์ ์ ๋ณด ์ถ์ถ
public String getUserPk(String token) { return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject(); }
- JWT์์ ์ถ์ถํ ์ฌ์ฉ์ ์ ๋ณด(email)๋ฅผ
loadUserByUsername(username)
ํจ์์ findByEmail์ ํตํด ์ค์ DB์์ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด- username : ์ด ํ๋ก์ ํธ์์๋ email์ ํด๋น
- DB์์ ๊ฐ์ ธ์จ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ UserDetails ๊ฐ์ฒด์ ๋ด์ return ํจ
- ์ด๋ ์ฌ์ฉ์ ์ ๋ณด์์ USER ROLE ๊ถํ์ ํ์ธํ์ฌ ๋ฆฌ์์ค ์ ๊ณต
- Postman์ผ๋ก ํ
์คํธ
POST: /user/me
์์ฒญ ์ Header์ X-AUTH-TOKEN์ (๋ก๊ทธ์ธ ์ ์์ฑํ) JWT๋ฅผ ํจ๊ป ๋ณด๋- Body์ ์์ ํ ๋๋ค์ ์ค์
- JWT์ ํตํด USER ROLE์ ํ์ธํ์ฌ ๋๋ค์ ์์ ์ฑ๊ณต
- nickname : user1 -> pizza ์์
ํ์ํ ๊ณณ์๋ง ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ์ฌ ๋ณด์์ ์ ์ฉ
- URL ๋ณ ๊ถํ ์ค์ ๊ฐ๋ฅ
- WebSecurityConfigure.java์ configure()์์ ์ค์
hasRole("USER")
๋ฅผ ํตํด USER, MY ์๋น์ค์ USER ROLE์ ๊ฐ์ง ์ฌ์ฉ์๋ง ์ ๊ทผ ํ์ฉ- USER, MY ์๋น์ค : ๋๋ค์ ์์ , ํ์ ํํด, ๋์ ๋ฆฌ๋ทฐ ๋ชฉ๋ก, ๋์ ์ฃผ๋ฌธ ๋ชฉ๋ก
permitAll()
์ ํตํด ์ด์ธ์ ์๋น์ค๋ USER๊ฐ ์๋์ด๋ ์ ๊ทผํ ์ ์๊ฒ ํจ@Override protected void configure(HttpSecurity httpSecurity) throws Exception{ httpSecurity ... .and() .authorizeRequests() .antMatchers("/api/user/**").hasRole("USER") .antMatchers("/api/my/**").hasRole("USER") .antMatchers("/api/**").permitAll() .antMatchers("/profile").permitAll() .and() ... }
๊ธฐ๋ณธ CRUD ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต ๊ฐ๋ฐ ์ ๋ฐ๋ณตํด ์์ฑํ ํ์ ์์
- CRUD ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณตํต ์ธํฐํ์ด์ค(JpaRepository ์์) ์ ๊ณต
- ์ธํฐํ์ด์ค๋ง ์์ฑํ๋ฉด ๋์ ์ผ๋ก ๊ตฌํ์ฒด๋ฅผ ์์ฑํด์ ์ฃผ์ ํด์ค
- ๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ง ์์ฑํด๋ ๊ฐ๋ฐ์ ์๋ฃํ ์ ์๋๋ก ์ง์
๊ณตํต ๋ฉ์๋ ์๋ count, delete, deleteAll, findById..
๋ฑ์ด ์์ผ๋ฉฐ,
๊ณตํต ๋ฉ์๋๊ฐ ์๋์ด๋ ๋ค์ด๋ฐ ๋ฃฐ์ ์ด์ฉํ์ฌ ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ์ฟผ๋ฆฌ ์คํ ๊ฐ๋ฅ
- CRUD ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณตํต ์ธํฐํ์ด์ค
- ์ด ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ ํด๋น ์ํฐํฐ์ ๋ํด CRUD๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์
- ์ค์ ๊ตฌํ์ฒด๋ SimpleJpaRepository์ด๋ฉฐ ์ด ํด๋์ค๊ฐ ๊ตฌํ
public interface MovieRepository extends JpaRepository<Movie, Long> {
}
- JPA๊ฐ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ ์ค ํ๋
- ๋ฉ์๋์ ์ด๋ฆ์ ์ค์ ํ์ฌ ํ์ํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์
- ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ ์ธ๋ง ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ์ ์ฉ1)
- ์ด๋ฉ์ผ(email)๋ก ํ์(user)์ ์กฐํํ๊ธฐ ์ํด UserRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
- ์์ ์ธ๊ธํ
loadUserByUsername(username)
ํจ์์์ username์ผ๋ก ๊ณ์ ์ ๋ณด ์กฐํ ์ ์ฌ์ฉ
public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByEmail(String email); }
- ์์ ์ธ๊ธํ
- query =
select u from User u where u.email = ?1
- ์ด๋ฉ์ผ(email)๋ก ํ์(user)์ ์กฐํํ๊ธฐ ์ํด UserRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
- ์ ์ฉ2) [MY - ๋ด ๋ฆฌ๋ทฐ]์ ์ ์ ๋ณ ๋ฆฌ๋ทฐ ๋ชฉ๋ก
- ํน์ ์ ์ (user)๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ(review)๋ฅผ ์กฐํํ๊ธฐ ReviewRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
public interface ReviewRepository extends JpaRepository<Review, Long> { List<Review> findAllByUser(User user); }
- query =
select r from Review r where r.user = :user
- ํน์ ์ ์ (user)๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ(review)๋ฅผ ์กฐํํ๊ธฐ ReviewRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
-
์ ์ฉ3) [MY - ๊ตฌ๋งค๋ด์ญ]์ ์ ์ ๋ณ ์ฃผ๋ฌธ ๋ชฉ๋ก
- ํน์ ์ ์ (user)๊ฐ ์์ฑํ ์ฃผ๋ฌธ(order)๋ฅผ ์กฐํํ๊ธฐ OrderRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
public interface OrderRepository extends JpaRepository<Order, Long> { List<Order> findAllByUser(User user); }
- query =
select o from Orders o where o.user = :order
- ํน์ ์ ์ (user)๊ฐ ์์ฑํ ์ฃผ๋ฌธ(order)๋ฅผ ์กฐํํ๊ธฐ OrderRepository์ ๋ณ๋์ ๋ฉ์๋ ์์ฑ
-
์ฐธ๊ณ : Spring Data JPA ๊ณต์ ๋ฌธ์
- ๋ฌธ์ ํ์ธ
- ๋ฐฐํฌ ์๋ : ๋ฐฐํฌํ๊ธฐ ์ํด EC2์์ -jar ๋ช ๋ น์ด ์คํ ์ ๊ฐ์๊ธฐ ์ ์งํจ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋๊ธฐ๊ณ ์๋ฌด๊ฒ๋ ํ ์ ์์ผ๋ฉฐ, ๋ค์ ๋น๋ ํด๋ ๊ฐ์ ํ์ ๋ฐ์
- AWS EC2 ์ธ์คํด์ค ๋ชจ๋ํฐ๋ง(Cloud watch) ํ์ธํ๋ CPU ์ฌ์ฉ๋ฅ ์ด ๊ธ์์นํ๋ค๊ฐ ํ๋ฝํ๋ ๊ฒ์ ํ์ธ
- ์์ธ
- ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ t2.micro(ํ๋ฆฌํฐ์ด)๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ 1GB
- ๋น๋ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ฌ ์ด๋ฌํ ํ์์ด ๋ํ๋จ
- ํด๊ฒฐ ๋ฐฉ๋ฒ
-
๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ์คํด์ค ์ ๊ทธ๋ ์ด๋์ด์ง๋ง(๋น์ฉ ๋ถ๊ณผ) Swap ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์
-
์ค์ํ(Swapping) : ๋ฆฌ๋ ์ค๋ ํ๋ ๋์คํฌ๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ํํด ์ฌ์ฉ
- ์ค์ ๊ณต๊ฐ ์ฟ ๊ธฐ ๊ณ์ฐ
- ๋ฌผ๋ฆฌ์ RAM ํฌ๊ธฐ๊ฐ 2GB ์ดํ์ธ ๊ฒฝ์ฐ, ๊ถ์ฅ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ RAM ์ฉ๋์ 2๋ฐฐ
- ์ด ํ๋ก์ ํธ์์๋ 1GB*2 = ์ฝ 2GB๋ฅผ ์ค์ํ ์ ์์
- ์์
- ๋ฃจํธ ํ์ผ ์์คํ
์ ์ค์ํ์ผ์ ์์ฑํ๋ค
sudo dd if=/dev/zero of=/mnt/swapfile bs=128M count=16
- 128M * 16๊ฐ = ์ฝ 2GB
- ์ค์ ํ์ผ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ถํ ์
๋ฐ์ดํธ
sudo chmod 600 /swapfile
- Linux ์ค์ ์์ญ ์ค์
sudo mkswap /swapfile
- ์ค์ ๊ณต๊ฐ์ ์ค์ ํ์ผ์ ์ถ๊ฐํ์ฌ ์ค์ ํ์ผ ์ฆ์ ์ฌ์ฉ
sudo swap /swapfile
- ์ฑ๊ณตํ๋์ง ํ์ธ
sudo swapon -s
- /etc/fstab ํ์ผ์ ํธ์งํ์ฌ ๋ถํ
์ ์ค์ ํ์ผ ์์
sudo vi /etc/fstab
- ํ์ผ ๋์
/swapfile swap swap defaults 0 0
์ถ๊ฐ - ์ ์ฅ ํ ์ข ๋ฃ
- ํ์ผ ๋์
- free๋ก ๋ฉ๋ชจ๋ฆฌ ์ํ ํ์ธ
- ๋ฃจํธ ํ์ผ ์์คํ
์ ์ค์ํ์ผ์ ์์ฑํ๋ค
- ์ค์ ๊ณต๊ฐ ์ฟ ๊ธฐ ๊ณ์ฐ
-
swap ๊ณต๊ฐ ํ์ฅ! ๋ฉ๋ชจ๋ฆฌ ์ฝ 3GB ์ฌ์ฉ ๊ฐ๋ฅ
-
- ์ฐธ๊ณ : AWS ํํ์ด์ง
- GoDaddy์์ ๋๋ฉ์ธ ๊ตฌ๋งค
- AWS Route 53์ ํธ์คํ ์์ญ ์์ฑ
- ํธ์คํ ์์ญ์ด ์์ฑ๋๋ฉด ์ ํ NS์ ๊ฐ 4๊ฐ๋ฅผ GoDaddy์ ๋ค์ ์๋ฒ์ ์ค์
- AWS Route 53์์ ๋ ์ฝ๋ ์ ํ A์ EC2 ํ๋ ฅ์ IP ์ฐ๊ฒฐ
- SSL(Secure Sockets Layer) ๋ณด์์ด ์ ์ฉ๋์ง ์์ HTTP ๋๋ฉ์ธ ์ฐ๊ฒฐ ์๋ฃ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์ํธํ
- ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ํด SSL์ ์ฌ์ฉํจ
- AWS Certificate Manager ํตํด ACM ์ธ์ฆ์ ๋ฐ๊ธ
- ๋๋ฉ์ธ ์ด๋ฆ์ ์ ๋ ฅํ์ฌ ์ธ์ฆ์ ์์ฒญ ํ ๋ ์ฝ๋ ๊ฒ์ฆ ์๋ฃ
- ๋ก๋ ๋ฐธ๋ฐ์ ์ค์
- ํ๊ฒ ๊ทธ๋ฃน ๋ง๋ค๊ธฐ
- ๋ก๋ ๋ฐธ๋ฐ์ ์์ฑ - Application Load Balancer
- ํฌํธ ์ถ๊ฐํ ๋ ํ๊ฒ ๊ทธ๋ฃน ์ ์ฉ
- SSL ๋ณด์ : listener์ ACM ์ธ์ฆ์ ์ ์ฉ
- Route 53์์ ๋จ์ ๋ผ์ฐํ
์ค์
- ๋ ์ฝ๋ ์ ํ A๋ฅผ ์ ํ
- ๊ฐ/ํธ๋ํฝ ๋ผ์ฐํ ๋์์ ์ด์ ์ ๋ง๋ ๋ก๋ ๋ฐธ๋ฐ์ ์ ์ฉ
- ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด HTTPS ์ฐ๊ฒฐ ์๋ฃ