함수형 메서드 3가지를 소개하여 간단하게 정리


 - forEach

 - map

 - filter



 1. forEach

  - for문 대신 사용할 수 있다.

  - 내가 사용하는 범위로는 Map, Array, Object에서 forEach()를 사용


 * 예제 데이터

var data = [

{title : "hello", content : "안녕하세요", age : 40  },
{title : "hi"   , content : "안녕"       , age : 30  },
{title : "hey" , content : "여 ~"      , age : 20  }

] ;


 * 예제 데이터 출력




 * forEach를 사용하여 출력


 2. map

  - 함수에서 정의한 방법대로 모든 원소를 가공해서 새로운 배열을 반환

  - 기존 Object는 유지하되 새로운 Object의 age가 5씩 늘어난 것을 볼 수 있다. 


3. filter

 - 원하는 조건의 데이터만을 리턴


3 - 1. filter + map

 - 원본 데이터를 유지, 필터로 새로운 데이터 저장


 - 나이 뒤에 단위 "세" 넣기


 - 가격단위 콤마(",") 넣기



[BoostCourse] 오프라인 스터디 진행 중 인터뷰


 - 일시 : 8/29(수) 오후 8시

 - 장소 : 커넥트재단 https://connect.or.kr/contact  강남역 2번 출구 앞 메리츠타워 7층


 * 참여하신 분들께 감사의 의미로 소정의 재단 기념품커피상품권 만원권을 드립니다. :)

 ** 인터뷰 후 동일 장소에서 스터디 진행하실 수 있도록 장소 확보해두었습니다.



 태풍 덕분에 미루고 미루어 지다가 잡힌 인터뷰 일정...


 - 인터뷰 질문 항목

 원할한 진행을 위해 질문 항목을 미리 공유드리지만 미리 스크립트를 준비하시거나 정형화된 답변을 준비하지 마시고

현장에서 자연스럽게 의견 주시면 좋겠습니다 :-)

 답변 내용에 따라 추가 질문도 있을수 있으니 참고해주세요.


 - 인터뷰 전체적인 진행


 1. 본인 소개

 2. 부스트코스 관련 질문

  1) 부스트코스를 알게된 계기

  2) 부스트코스에서 본인이 선택한 강의를 듣게된 계기

  3) 부스트코스 컨텐츠에 대한 전반적인 의견 (강의 & 프로젝트)

  4) edwith 플랫폼을 사용하면서 편리했던 점, 불편했던 점

  5) 본인만의 부스트코스 학습 노하우, 팁


 3. 스터디 관련 질문

  1) 개인 의견

   - 부스트코스를 신청한 이유 

   - 혼자 공부와 오프라인 스터디의 이점

   - 스터디하면서 어려운점

   - 스터디 조원 구성에 있어 가장 중요한 점 (나이, 진도, 프로그래밍 실력, 성향)

   - 부스트코스 스터디를 진행해본 소감


  2) 단체 의견

   - 스터디 진행 방식

   - 스터디 일정 관리표 활용법 (진도체크, 질문 기록, 동기부여)

   - 운영진에서 제공하는 스터디 일정 관리표 외에 다른 형태의 학습일지를 만드는지

   - 스터디 내에서 조원들의 학습에 가장 기여를 많이 했다고 생각되는 조원

   - 학습 동기부여를 위해 조원들 자체적으로 하고 있는 일 (지각비, 과제)

   - 재단에서 스터디 운영을 위해 지원하는 부분(장소비, Q&A) 외에 희망하는 것


 4. 기타

  1) 앞으로 부스트코스에 기대하는 점

  2) 부스트코스로 개설 희망 분야, 과목


 이런 주제를 가지고 8시에 시작한 인터뷰... 즐겁게 이야기를 나누었으나..


 많은 이야기를 주고 받았던 것 같은데...  너무 늦게 기록해서 내용은 거의다 까먹었다... 


 (특강 때 부채 나눠줬다고 사람들이 뭐라고 했었다고 한다..)



 공책, 포스트잇 잘 쓰고 있습니다 ㅎㅎ !


// 20180918 포스팅


https://m.post.naver.com/viewer/postView.nhn?volumeNo=16727405&memberNo=34635212

BoostCourse 진행 중에 HTML Template 해야하는 일이 생겨 정리


HTML Template (String.replace() 사용하기)



 - ${id}가 2개, ${description} 2개, ${placeName}, ${content}가 존재한다.

 - 위 문자열들을 바꿔야 하는데 JS에는 string에 replace()함수가 존재한다.

 - 하지만 replace()가지고는 {id}를 내가 원하는 변수의 값으로 바꾸기 위해서는 개수 대로 써줘야 한다.



 얼마나 멍청한 짓인고....


그래서 찾아봤다. 자바에 replaceAll같은 함수가 있는지.. 

하지만 JavaScript에는 replaceAll은 없고 정규표현식을 이용하여 replaceAll의 기능을 구현해야한다.


tempalte에 정의되어 있는 상태는 ${ 변수명 }를 바꾸어야한다.


MDN :: https://developer.mozilla.org/ko/docs/Web/JavaScript

위 사이트를 참조했을때 수행되어야할 일은 ${ }이와같은 특수문자로 감싼 데이터만을 골라 낸 뒤 바꿔야 한다.


 1. 일단 정규표현식의 패턴


/ 문자 /


  - 정규표현식은 슬래쉬로 감싸면 된다.

  - 또는 RegExp 생성자 함수를 호출한다.


var re = RegExp("문자");


  - 생성자 함수의 호출은 다른 출처로부터 패턴을 가져와야 하는 경우 사용한다.


 2. 사용해야할 정규표현식 문법


  - 우선 $ { } 같은 특수문자를 제거 해야 한다.

  - 특수문자를 특별하지 않은 문자로 인식하게 하는 방법은 역슬래시를 사용하는 것이다.


\$ \{  \}


  - 이렇게 되면 javascript는 아무것도 출력하지 않는다.


 3. 플래그를 사용한 고급검색 (replaceAll과 같은 전역검색)


  - g : 전역 검색

  - i : 대소문자 구분없는 검색

  - m : 다중행 검색

  - u : 유니코드 패턴을 유니코드 코드 포인트의 나열로 취급

  - y : "sticky" 검색을 수행, 문자열의 현재 위치부터 검색을 수행


 4. 결과적으로 정규표현식을 적용한 replace()





 결과물 


  - 문자열도 잘 바뀐 것 같고 화면도 나오긴 나온다.


프로젝트를 하는 중에 어노테이션의 구분을 제대로 하지 못해 시간을 날린 기억에 간단하게 정리 한다.

(Project 3 내용 범위의 방법론에 대해서만 정리)


사전지식

 Spring MVC

  - 프론트 컨트롤러

  - 핸들러

 


@Controller와 @RestController의 차이

 (Spring MVC vs Restful 웹서비스 컨트롤러)


 - @Controller는 화면(View)을 리턴하는 용도




 - @RestController는 데이터를 리턴하는 용도




@RestController는 Spring 4.x 버전이후 등장한 어노테이션이기 때문에 


만약 Spring 3.x에서 @RestController의 기능을 구현하기 위해서는 


@Controller와 메서드 리턴타입을 @ResponseBody를 붙여야 한다.


 - @Controller + @ResponseBody




결과적으로 사용방법은 이러하다.




밑의 내용은 어노테이션 사용시 구조적인 차이와 동작 방식


 @Controller만 사용할 경우 동작 흐름




 @Controller + @ResponseBody를 사용할 경우 동작 흐름



@RestController를 사용할 경우 동작 흐름




Spring Test 코드 작성기


 - Boostcourse 프로젝트 작성 시 

   데이터가 제대로 출력되는지 확인하기 위해서 서버를 올렸다 내렸다 하기 귀찮아서 테스트 클래스를 따로 만듦


요약

 1. Pom.xml에 spring-test, junit 설정

 2. DB 설정

 3. Test 코드 작성


 - 필요 라이브러리 (Pom.xml)


spring-test

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-test</artifactId>

    <version>${spring.version}</version>

    <scope>test</scope>

</dependency>

junit

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>



 - DB 설정


 여기서는 개인의 DB 설정 방법에 따라 다름

 (xml에 DB설정 또는 java class에 DB설정)


 - 내 프로젝트 구성


 - 특이사항이라면 xml로 DB 설정이 xml에 설정되어 있는 것이 아니라 Java class에 DB 설정


ApplicationContext.class

@Configuration

@ComponentScan(basePackages = { "kr.or.seok.naver.dao", "kr.or.seok.naver.service" })

@Import({ DBConfig.class })

public class ApplicationConfig {


}


 - application.properties 파일에 DB 설정 정보를 담아 놓고 @PropertySource 어노테이션으로 불러다가 사용


DBConfig.class


@Configuration

@PropertySource({"classpath:application.properties"})

@EnableTransactionManagement

public class DBConfig implements TransactionManagementConfigurer {


@Value("${spring.datasource.driver-class-name}")

private String driverClassName;

@Value("${spring.datasource.url}")

private String url;


@Value("${spring.datasource.username}")

private String username;

@Value("${spring.datasource.password}")

private String password;

/**

 * DataSource 설정

 * @return

 */

@Bean

public DataSource datasource() {

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName(driverClassName);

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);

return dataSource;

}


/**

 * Transaction처리 기능을 사용하기위한 설정

 * 

 * @return

 */

@Bean

public PlatformTransactionManager transactionManager() {

// DB 설정을 커스터마이징 하기 위한 메서드

return new DataSourceTransactionManager(datasource());

}


@Override

public PlatformTransactionManager annotationDrivenTransactionManager() {

return transactionManager();

}


}


 - TestCode 작성


 기존 BoostCourse에서 배운 Test 방법

 하나의 기능만 테스트를 하기엔 별 문제 없으나 하나의 클래스에서 여러 테스트를 하기 위해서는 ApplicationContext를 계속 써줘야함


public class TestDaoPromotion {


/**

* 프로모션(Promotion) 출력

*/

@Test

// @Ignore

public void testProduct() {

// DB 설정

ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);

PromotionDao promotionDao = ac.getBean(PromotionDao.class);


List<Promotion> promotions = promotionDao.getPromotions();


for (Promotion promotion : promotions) {

System.out.println(promotion);

}

}

}


 

그래서 수정해봄


@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = {ApplicationConfig.class, DBConfig.class})

@WebAppConfiguration

public class TestDaoPromotion {


@Autowired

PromotionDao promotionDao;

 

/**

* 프로모션(Promotion) 출력

*/

@Test

public void testProduct() {

List<Promotion> promotions = promotionDao.getPromotions();


for (Promotion promotion : promotions) {

System.out.println(promotion);

}

}


}




결론


 - promotion, category 에서는 필요한 메서드가 하나 뿐이라 테스트코드가 의미 없어보일 수도 있으나 

product와 그 이후 작업을 위해서 세팅

+ Recent posts