///////
Search

1101 백엔드 회고

알고리즘

소수 찾기

소수란? : 1과 자기 자신 외에 나누어떨어지는게 없는 수
소수를 판별 하는 법
1.
n이란 수가 있으면 n을 2부터 n-1까지 나누어 보는 방법 O(N)
2.
n/2 미만까지 n을 n/2까지 나누어 보는 방법 O(N)
3.
루트 n 까지(포함) 나누어 보는 방법 EX) √29 는 5.xx이므로 5 이하의 정수로만 나눠서 확인
1번 방법
public boolean isPrime(int num){ // 1. n이란 수가 있으면 n을 2부터 n-1까지 나누어 보는 방법 O(N) // 2부터 자기 자신 전까지 나누어 떨어지는지 반복해서 나눠본다 for (int i = 2; i < num; i++) { if(num%i == 0){ return false; } } return true; }
Java
복사
2번 방법
public boolean isPrime2(int num){ //2. n/2해서 소수 구하기 for (int i = 2; i < num/2; i++) { if(num%i == 0){ return false; } } return true; }
Java
복사
3번 방법
public boolean isPrime3(int num){ //3.루트 사용해서 소수 구하기 for (int i = 2; i * i < num; i++) { if(num%i == 0){ return false; } } return true; }
Java
복사

Template Callback 적용

사용 이유 : 변화되는 부분을 매번 클래스로 만들지 않고 , 내부 클래스를 바로 생성하여 이용한다. (i < num, i < num/2, i * i <= num 같은 특정 부분만 바뀌기 때문에 논리 연산 하는 부분을 함수로 분리한다)
Template Callback 적용
public class TemplateCallbackPrime { //Template Callback boolean someOperation(int a, int b) { return a < b; } boolean isPrime(int num) { //i<num을 someOperation 함수에서 return for (int i = 2; someOperation(i, num); i++) { if(num % i == 0) return false; } return true; }
Java
복사
StatementStrategy 적용
interface StatementStrategy{ //인터페이스 사용 boolean compare(int a , int b); } boolean isPrime(int num,StatementStrategy stmt){ for (int i = 2; stmt.compare(i,num); i++) { if(num%i == 0) return false; } return true; }
Java
복사
익명 내부 클래스 사용
public class TemplateCallbackPrime { boolean isPrime(int num, StatementStrategy stmt) { for (int i = 2; stmt.compare(i, num); i++) { System.out.println(i); if(num%i == 0) return false; } return true; }
Java
복사

DB에 Insert하기

HospitalDao
@Component public class HospitalDao { //요즘에는 @Autowired를 쓰는것 보다 private final 로 사용한다. private final JdbcTemplate jdbcTemplate; public HospitalDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }
Java
복사
HospitalDao - add()
Insert 구문을 작성하여 Value 값을 Mapping 해준다
Alter 테이블을 하여 데이터 타입과 크기를 변경한다.
Alter 테이블을 할때 타입 변경시 주의 float → int 10.1 → 10 , 0.2 → 0 int → float 10 → 10.0 0 → 0.0
테이블 작업시 백업을 하여 데이터를 보관한 뒤에 작업을 하는것이 좋다
Table Data Export Wizard 클릭 → Next 반복클릭!

Architecture 구조

SpringBoot

@SpringBootApplication → @ComponentScan @Component, @Configuration, @Service, @Repository 등이 붙어있는 클래스를 Bean으로 등록 해줘서 HopitalDao는 Factory가 없어도 DI 적용
테스트 코드에 test.java에 코드가 있다 - HospitalParserTest 클래스에 @SpringBootTest 를 안붙이면 안돌아간다.
@SpringBootTest 는 모든 빈들을 스캔하고 애플리케이션 컨텍스트를 생성하여 테스트를 실행한다.
@ComponentScan 은 @SpringBootApplication 이 붙은 클래스 이하에 있는 모든 패키지를 스캔해서 @Component, @Configuration, @Service, @Repository 등이 붙어있는 클래스를 빈으로 등록 한다.

deleteAll(), getCount()

public void deleteAll(){ this.jdbcTemplate.update("delete from nation_wide_hospitals"); } public int getCount(){ String sql = "SELECT count(id) FROM likelion.nation_wide_hospitals"; return this.jdbcTemplate.queryForObject(sql,Integer.class); }
Java
복사
Test 코드
1.
hospital 테이블을 삭제한다.
2.
테이블에 데이터의 개수가 0개인지 확인한다.
3.
line1을 정제하고 insert 한다.
4.
테이블에 데이터의 개수가 1개인지 확인한다.
String line1 = "\"1\",\"의원\",\"01_01_02_P\",\"3620000\",\"PHMA119993620020041100004\",\"19990612\",\"\",\"01\",\"영업/정상\",\"13\",\"영업중\",\"\",\"\",\"\",\"\",\"062-515-2875\",\"\",\"500881\",\"광주광역시 북구 풍향동 565번지 4호 3층\",\"광주광역시 북구 동문대로 24, 3층 (풍향동)\",\"61205\",\"효치과의원\",\"20211115113642\",\"U\",\"2021-11-17 02:40:00.0\",\"치과의원\",\"192630.735112\",\"185314.617632\",\"치과의원\",\"1\",\"0\",\"0\",\"52.29\",\"401\",\"치과\",\"\",\"\",\"\",\"0\",\"0\",\"\",\"\",\"0\",\"\""; @Test @DisplayName("Hospital이 insert가 잘 되는지") void add(){ hospitalDao.deleteAll(); assertEquals(0,hospitalDao.getCount()); HospitalParser hp = new HospitalParser(); Hospital hospital = hp.parse(line1); hospitalDao.add(hospital); assertEquals(1,hospitalDao.getCount());
Java
복사
findById() , RowMapper