TIL - 0515

스프링부트

h2 데이터베이스 연결 - 사용하기

  • 데이터베이스 사용 : 메모리에 저장하면 프로세스 종료 후 데이터가 모두 날아감, 데이터를 공유하기위해서 복잡도가 높아질 수 있음
    • 복잡도 문제 : 접근 객체(XXXRepository)만 만들면 됨, 같은 곳 접근
  • JDBC : DB 변경할 때마다 코드 변경을 최대한 없애기위해 표준 인터페이스를 마련함
    • h2 : 순수 자바로 짜여진 임베디드 데이터베이스, jar 파일만 임포트하면 사용할 수 있음(타 db는 드라이버 임포트까지 해줘야함)
  • JPA : 데이터베이스 테이블을 객체지향적으로 다루는 ORM의 표준 인터페이스 - 구현체로 Hibernate 등이 있음
    • SQL 중심 개발에서 벗어난 개발 : 테이블 다루는 것을 메소드로 래핑해두면 내부만 변경되면 됨(변경에도 용이함), 객체 관계도를 그대로 사용할 수도 있음
    • JPA 참고
  • gradle dependency 설정
dependencies {
    compileOnly ('org.projectlombok:lombok:1.16.20')
    apt ("org.projectlombok:lombok:1.16.20")

    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile ('pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.0')
    
    compile('org.hibernate:hibernate-java8')
    
    
    runtime('com.h2database:h2')
    
    runtime('net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.1.0')
    runtime("org.springframework.boot:spring-boot-devtools")
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.assertj:assertj-core:3.9.0')
}
  • h2 데이터베이스 : 기본적으로 jvm 메모리에 올리게되는데, 외부에서 접근할 수 없으므로 디펜던시 설정 시 runtime이 아닌 compile로 할 것을 추천
  • application.properties : 자바 코드로 설정하지않고, properties 파일에 설정만 해두면 알아서 적용됨
# jdbc settings
spring.datasource.url=jdbc:h2:~/java-qna;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

## jpa settings
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
  • Entity 클래스 설정
    • Entity(개체) : 실체, 테이블의 레코드에 해당함
    • 데이터베이스 테이블과 연결될 클래스
@Entity
public class User {
	@Id
	@GeneratedValue
	private Long id;
	
	@Column(nullable = false, length = 15)
	private String userId;
	      . 
	      .
	      .
}
  • @Entity : 엔티티 클래스 임을 설
  • @Id : 해당 인스턴스 변수가 PK(Primary Key)로 설정
  • @GeneratedValue : 자동적으로 생성하면서 1씩 증가되도록 설정
  • @Column : column에 대한 설정, 디폴트값이 있음(어노테이션을 따라가보면 default가 지정되어있고, 속성 = 값으로 변경가능)

  • JPA 사용하기
    • 이미 만들어져있는 JPA 구현 클래스를 dependency injection 후 사용 : @Autowired 어노테이션으로 설정해줘야함
    • 기존에는 DAO를 접미사로 붙였지만 최근에는 Repository를 사용하는 추세
@Controller
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserRepository userRepo;
    
    @PostMapping
    public String create(User user) {
        userRepo.save(user); /* 쿼리는 알 필요없고, Entity만 실어서 메소드 호출하면 됨 */
        return "redirect:/users";
    }    
}

네트워크

도메인을 IP로 바꾸자

  • 도메인을 가지고 엔드포인트의 도착지점이 어딘지 알 수 없음 : 인간이 기억하기좋은 것이지 컴퓨터를 알 수 없음, 멍청하다!
  • DNS 서버 : 도메인 네임과 IP를 맵핑한 레코드를 가지고 있다가 요청을 받으면 도메인에 대한 IP를 찾아서 응답해주는 서버
    • DNS 서버 IP : 기본적으로 자동 설정되어있고, 수동으로 DNS 서버를 지정해줄 수 있음

  • gethostbyname : 리졸버(DNS에 요청해주는 프로그램)에 제어권을 넘겨서 도메인에 대한 IP를 가져옴 -> 추출 -> 메모리 저장
  • 네트워크 어플리케이션, 리졸버 모두 통신은 OS에 통신을 위임해서 요청을 함 : 네트워크 통신 기능이 자체적으로 없음

IP는 어떻게 이뤄져있나

  • IP : IPv4 기준 32비트 네트워크에 연결된 호스트의 식별자 번호(할당되거나 수동으로 할당하거나)
    • 0과 1로 이뤄진 숫자(비트)를 10진수로 바꿔서 기억하기 좋은 형태로 사용 : 물론 도메인으로 맵핑해서 사용하지만!
    • 32비트를 8비트씩 4자리로 끊어서 사용 : 1자리 당 최대 255까지(2^0 + … + 2^7)
125.209.222.141
  • 통신 용도에 따라 3가지 종류가 있음
    • 유니캐스트 주소 : 1:1, 패킷 전달 대상이 1곳(보통 유니캐스트 주소)
    • 브로드캐스트 주소 : 서브넷에 연결되어있는 모든 호스트에 패킷을 전달함
    • 멀티캐스트 주소 : 어떤 특징에 의해 그룹화된 호스트들에 패킷을 전달함
  • TCP/IP 네트워크 기반 네트워크 구조는 서브넷 구조 : 하나의 라우터에 여러 허브를 꽂고 허브에 여러 기기들이 연결되어있는 형태
    • 사설망을 만들어 사설 IP(내부 IP)할당 : 통신 때는 공개IP(공인IP)를 사용
    • 넷마스크 : IP는 하나의 호스트만 식별하는 것 같지만 넷마스크에 의해 네트워크 번호 + 호스트 번호를 구별해서 하나의 서브넷 내 호스트를 식별하게함
    • 네트워크 번호 : 서브넷 주소
    • 호스트 번호 : 서브넷에 연결된 호스트 주소
125.209.222.141/24

혹은
IP : 125.209.222.141
netmask : 255.255.255.0
  • 위 두 표현은 같은 표현 : 24비트까지는 네트워크 번호(비트에서 1인 부분) + 25 ~ 32비트까지 호스트 번호(비트에서 0인 부분)
  • 호스트 번호 부분이 모두 0이라면 네트워크(서브넷)을 의미하는 IP
  • 호스트 번호 부분이 모두 1이라면 브로드캐스트 IP(전체에 패킷)